Android Studio NDK开发攻略(JNI)

2016-06-28  本文已影响71人  trayliu_小马过河

JNI

Java Native Interface,java本地接口。通俗地说,JNI是一种技术,通过这种技术可以做到以下两点:
· Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
· Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数。

Android平台中JNI示意图.png
为什么使用NDK

1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

NDK下的C/C++函数和Java桥接的函数命名规则:

    Java_PackageName_ClassName_MethodName

对应的java 文件 包名—类名—方法名

编码GBK的不可映射字符.png

解决方法:javah -encoding utf-8 -jni com.echo.soundbar.SecondActivity

Execution failed for task ':app:compileDebugNdk'.

app:compileDebugNdk.png

这个问题是NDK在windows平台下面的一个BUG,如果编译的.c/.cpp只有一个,就会出现这个问题
解决办法:随意新建任意的.c 和.h文件即可编译通过,这是死丢丢的bug,从1.5到2.1

Paste_Image.png

当Terminal不在主目录的时候,无法执行clean操作。

Paste_Image.png

Gradle添加NDK模块

打开app模组下的build.gradle文件,在defaultConfig模块下添加ndk模块

    ndk{   
    moduleName "SoundBar"   //NDK模块  System.loadLibrary()加载.so时的名称对应   
    ldLibs "log", "z", "m"//链接的库   
     abiFilters "armeabi", "armeabi-v7a", "x86"//共七个未指定则全部编译
    }
moduleName

是编译的.so的模组名称,就是原先Eclipse开发里Android.mk文件中LOCAL_MODULE变量,和System.loadLibrary()加载.so时的名称对应。

abiFilters

指定要分配的平台,如果未指定,则将编译所有支持的平台。目前支持的平台有"armeabi"、"armeabi-v7a"、"arm64-v8a"、"mips"、"mips64"、"x86"、"x86_64"这七个;

ldLibs

是要链接的库,就是原先Android.mk里LOCAL_LDLIBS变量指定的库。

Paste_Image.png

在gradle.properties s文件末尾里面添加 android.useDeprecatedNdk=true 后重新编译即可

生成so文件的位置

在app/build/intermediates/ndk/debug目录下生成了三个文件夹,对应在build.gradle配置的abiFilters。

生成so文件的位置.png

添加C/C++文件

默认情况下,C/C++文件一般放在[module]/src/main/jni/目录下,如图:

c 、c++文件默认存放位置.png

当然,你也可以修改build.gradle配置,指定其他路径。在"android.sourceSets.main"模块里,使用"jni.srcDirs"指定jni的路径,如下图:

指定jni 路径.png

使用android studio进行ndk 开发

修改本地配置文件


local.properties
    sdk.dir=D\:\\SoftwareForCode\\adt-bundle-windows-x86_64-20140702\\sdk
    ndk.dir=D\:\\SoftwareForCode\\adt-bundle-windows-x86_64-20140702\\android-ndk-r10

第一步:创建java本地接口

参考:http://wiki.jikexueyuan.com/project/deep-android-v1/jni.html
http://gold.xitu.io/entry/57086e1fa34131004c0b13d5
http://www.codernote.top/blog/info/138
http://www.xpabc.com/xpabc/article/show/189.htm

上一篇下一篇

猜你喜欢

热点阅读