JNI
Java Native Interface,java本地接口。通俗地说,JNI是一种技术,通过这种技术可以做到以下两点:
· Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
· Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数。
为什么使用NDK
1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
NDK下的C/C++函数和Java桥接的函数命名规则:
Java_PackageName_ClassName_MethodName
对应的java 文件 包名—类名—方法名
解决方法:javah -encoding utf-8 -jni com.echo.soundbar.SecondActivity
Execution failed for task ':app:compileDebugNdk'.

这个问题是NDK在windows平台下面的一个BUG,如果编译的.c/.cpp只有一个,就会出现这个问题
解决办法:随意新建任意的.c 和.h文件即可编译通过,这是死丢丢的bug,从1.5到2.1
坑
当Terminal不在主目录的时候,无法执行clean操作。

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变量指定的库。
在gradle.properties s文件末尾里面添加 android.useDeprecatedNdk=true 后重新编译即可
生成so文件的位置
在app/build/intermediates/ndk/debug目录下生成了三个文件夹,对应在build.gradle配置的abiFilters。
添加C/C++文件
默认情况下,C/C++文件一般放在[module]/src/main/jni/目录下,如图:
当然,你也可以修改build.gradle配置,指定其他路径。在"android.sourceSets.main"模块里,使用"jni.srcDirs"指定jni的路径,如下图:
使用android studio进行ndk 开发
修改本地配置文件
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