转自:https://github.com/jeanboydev/Android-JNITest

1.介绍

Android Studio + NDK来实现JNI。

什么是NDK与JNI技术?
NDK:Native Development Kit

The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++.(谷歌官方文档)

大致意思:NDK是一个工具,可以让你实现你的应用程序使用本地代码的语言,如C和C++的部分。

JNI:Java Native Interface
它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

准备工作

  • 1.搭建好Android Studio开发环境。
  • 2.新建一个Android项目

Android Studio配置NDK

  • 1.如图所示下载LLDB+NDK并安装。

  • 2.配置安装好的NDK路径。

  • 3.配置一些快捷方式。



    javah   用于生成头文件Program:$JDKPath$/bin/javah注意:这个命令我加上了-encoding UTF-8指定编码,你可以改成你工程的编码。Parameters:-encoding UTF-8 -d ../jni -jni $FileClass$Working directory:$SourcepathEntry$\..\javandk-build   用于构建so包注意:MAC/Linux用ndk-build,没有.cmd后缀Program:C:\Develop\Android\sdk\ndk-bundle\ndk-build.cmdParameters:什么都不用填Working directory:$ModuleFileDir$\src\mainndk-build clean 清除so包注意:MAC/Linux用ndk-build,没有.cmd后缀Program:C:\Develop\Android\sdk\ndk-bundle\ndk-build.cmdParameters:cleanWorking directory:$ModuleFileDir$\src\main

配置项目

  • 在gradle.properties文件中添加
    android.useDeprecatedNdk=true
  • 修改文件目录如下

  • 参考Android Studio Project Site

  • 1.修改根目录下的build.gradle

    buildscript {repositories {jcenter()}dependencies {//  修改build:gradle为build:gradle-experimentalclasspath "com.android.tools.build:gradle-experimental:0.7.0"//        classpath 'com.android.tools.build:gradle:2.1.2'}}allprojects {repositories {jcenter()}}//添加task clean(type: Delete) {delete rootProject.buildDir}
  • 2.修改gradle->wrapper->gradle-wrapper.properties
    #Mon Dec 28 10:00:20 PST 2015distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip//修改这里的版本号
  • gradle-experimental与gradle-wrapper相对应的版本号如下图

  • 3.修改app->build.gradle

    修改之前的apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {applicationId "com.jeanboy.demo.jnitest"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:23.4.0'}
    修改之后的apply plugin: 'com.android.model.application'//修改//apply plugin: 'com.android.application'model {//修改android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {applicationId "com.jeanboy.demo.jnitest"minSdkVersion.apiLevel 15targetSdkVersion.apiLevel 23versionCode   1versionName   "1.0"}ndk {//指定生成的lib,比如此时生成native.somoduleName   "NdkTest"}buildTypes {release {minifyEnabled falseproguardFiles.add(file("proguard-rules.pro"))//修改}}}}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:23.4.0'}
  • 4.创建jni文件夹

  • 5.创建NdkTest.java

    public class NdkTest {static {System.loadLibrary("NdkTest");//加载要使用的so文件}//生命native方法public static native String getString();public static native int doAdd(int param1,int param2);}
  • 6.生成NdkTest.h并创建NdkTest.cpp实现NdkTest.h中的native方法

NdkTest.h文件内容

    /* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jeanboy_demo_jnitest_NdkTest */#ifndef _Included_com_jeanboy_demo_jnitest_NdkTest#define _Included_com_jeanboy_demo_jnitest_NdkTest#ifdef __cplusplusextern "C" {#endif/*
     * Class:     com_jeanboy_demo_jnitest_NdkTest
     * Method:    getString
     * Signature: ()Ljava/lang/String;
     */JNIEXPORT jstring JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_getString(JNIEnv *, jclass);//待实现的native方法/*
     * Class:     com_jeanboy_demo_jnitest_NdkTest
     * Method:    doAdd
     * Signature: (II)I
     */JNIEXPORT jint JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_doAdd(JNIEnv *, jclass, jint, jint);//待实现的native方法#ifdef __cplusplus}#endif#endif

NdkTest.cpp文件内容

    #include "com_jeanboy_demo_jnitest_NdkTest.h"JNIEXPORT jstring JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_getString(JNIEnv *env, jclass type) {//具体实现return env->NewStringUTF("hello world!!!");}/*
     * Class:     com_jeanboy_demo_jnitest_NdkTest
     * Method:    doAdd
     * Signature: (II)I
     */JNIEXPORT jint JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_doAdd(JNIEnv *env, jclass type, jint param1, jint param2) {//具体实现return param1 + param1;}
  • 7.在jni文件夹下创建Android.mk和Application.mk

Android.mk文件内容

    LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := NdkTest//moduleNameLOCAL_SRC_FILES := NdkTest.cpp//上面创建的NdkTest.cppinclude $(BUILD_SHARED_LIBRARY)

Application.mk文件内容

    APP_MODULES := NdkTest/*这个变量是可选的,如果没有定义,NDK将由在Android.mk中声明的默认的模块编译,并且包含所有的子文件(makefile文件);
    如果APP_MODULES定义了,它不许是一个空格分隔的模块列表,这个模块名字被定义在Android.mk文件中的LOCAL_MODULE中。
    注意NDK会自动计算模块的依赖*/APP_ABI := all//支持所有平台,也可以指定平台空格隔开armeabi armeabi-v7a x86
    Android系统目前支持的CPU架构:ARMv5,ARMv7 (从2010年起)x86 (从2011年起)MIPS (从2012年起)ARMv8,MIPS64和x86_64 (从2014年起)每一个CPU架构对应一个ABICPU架构           ABIARMv5   --->    armeabiARMv7   --->    armeabi-v7ax86     --->    x86MIPS    --->    mipsARMv8   --->    arm64-v8aMIPS64  --->    mips64x86_64  --->    x86_64armeabi:默认选项,将创建以基于ARM* v5TE 的设备为目标的库。 具有这种目标的浮点运算使用软件浮点运算。 使用此ABI(二进制接口)创建的二进制代码将可以在所有 ARM*设备上运行。所以armeabi通用性很强。但是速度慢armeabi-v7a:创建支持基于ARM* v7 的设备的库,并将使用硬件FPU指令。armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu。mips:MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。x86:支持基于硬件的浮点运算的IA-32 指令集。x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小。总结如果项目只包含了 armeabi,那么在所有Android设备都可以运行;如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的;如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
  • 8.生成so文件

  • 9.在需要native方法的地方直接调用

    NdkTest.getString();NdkTest.doAdd(5, 12);
  • 10.运行app试试效果吧

Android Studio 第一个JNI程序相关推荐

  1. Android Studio第一个NDK程序

    原址 由于最近比较有空,特地记录一下之前学习Android Studio NDK环境部署的过程,以免以后忘记. 开发环境: Window 10 Android Studio 2.0 1.在Androi ...

  2. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...

  3. android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程

    本文主要介绍在android studio下实现jni单步调试时,所需要的配置及其步骤,这些也是本人经过几天折腾慢慢实现的,先提供给大家做参考: 1,配置是在mac下android studio实现的 ...

  4. 使用Android Studio编写一个简单的音乐盒

    文章目录 一.知识要点 二.xml代码 activity_main.xml 三.java代码 MainActivity.java MusicService.java 四.运行界面展示 五. 源码Git ...

  5. android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...

    Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案 大家在设计APP的末期,都会想给APP搞一些"花里胡哨"的特效来提高APP的B格.博主表示亲测有效 ...

  6. 如何使用android studio制作一个阿里云物联网APP

    摘要:要想学会物联网技术,需要掌握的知识真的有太多了,其中一个关键的技能,也是决定物联网技能等级的,就是移动端开发能力.当然,现在有很多平台都提供了各种各样的移动端应用,但是都相对封闭,我们无法掌握其 ...

  7. 在Android Studio中运行Java程序

    在Android Studio中运行Java程序 有时候在开发Android时,由于调试需要,需要写一些Java程序. 由于类库引用等问题,去IntelliJ IDEA新建一个Java程序还要添加类库 ...

  8. Android Studio执行出现“应用程序安装异常(-15)

    Android Studio执行出现"应用程序安装异常(-15) gradle.propeities文件,在最底下加入: android.injected.testOnly=false 我的 ...

  9. Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信

    Android Studio在类微信程序完成"蓝牙聊天功能"实现蓝牙通信 项目运行截图 通信原理 蓝牙权限 strings.xml tab01.xml 菜单文件option_men ...

最新文章

  1. 颠覆认知:SRE 到底是干啥的?
  2. 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?
  3. 打印dataframe的前十行_小学生之十行Python解高思五星题(一)
  4. sharepoint Lists Web service 用法
  5. YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】
  6. Couchbase 2.0归类视图简介
  7. 悲观锁和乐观锁_面试必备之乐观锁与悲观锁
  8. linux top 命令可视化_Linux 使用 top 命令查看系统的运行情况
  9. 《你不常用的c#之二》:略谈GCHandle
  10. python程序设计遇到的问题_Python程序设计与实践:用计算思维解决问题
  11. ansible-playbook之循环(Loops)
  12. NIS企业级应用案例-统一Linux和Windows身份验证(二)
  13. FFmpeg源代码简单分析-通用-结构体分析-AVCodec
  14. 2022蓝帽杯半决赛电子取证
  15. 智能机器人建房子后房价走势_机器人建楼、5G住宅……房地产下半场要这样玩...
  16. 单耳蓝牙耳机怎么连接_蓝牙耳机怎么连接
  17. java连接mongo数据库,并执行db.runCommand命令
  18. php解决时间2038问题,PHP实例:关于PHP转换超过2038年日期出错的问题解决
  19. 【深度学习】ReID相关知识点解析(PCB、BoT、MGN)
  20. couldnotfindartifactcom.orcale:ojdbc6:pom:11.2.0.1.0innexus-aliyun

热门文章

  1. 不要让Javascript的等价表格看上去那么难看
  2. IDC评述网:1月下旬国内域名注册商净增量Top10
  3. flash中物体运动基础之七---------碰撞处理
  4. Catalyst 65xx系列交换机配置(Native IOS)
  5. IntelliJ IDEA 2016
  6. 2014年国内最热门的.NET开源项目TOP25
  7. Java计算的XML面试题
  8. python常用程序代码(持续更新收集)
  9. pythonmooc期末考试编程题_大学moocPython编程基础期末考试搜题公众号答案
  10. 微信公众号接入百度天气API接口