IDE:Android Studio 1.3
操作系统:Ubuntu 14.04 LTS
基本使用
- 1.去官网下载NDK,配置好路径
- 2.新建JNIClass文件来写Java类
public class HelloClass {
static {
System.loadLibrary("app"); // module的名字
}
public native String stringFromJNI(); // 声明本地方法
}
- 3.编译一下,build -> project ,生成类文件
进入app/build的文件夹可查看.class 文件
例如我的路径:
/home/zero/Downloads/NDK/app/build/intermediates/classes/debug/
- 4.切换到终端,进入到main目录下(到时jni文件直接输入到该目录下)
- 5.使用javah生成头文件
命令
javah -d jni -classpath ../../build/intermediates/classes/debug com.zero.ndk.JNIClass.HelloClass
会发现main目录下多了一个jni,里面有一个.h文件 - 6.编写.c或.cpp 文件,在jni下新建一个源文件,方法名一定要从.h中复制过来
#include <string.h>
#include <jni.h>
jstring Java_com_zero_ndk_JNIClass_HelloClass_stringFromJNI( JNIEnv* env, jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}
- 7.在project下的local.properties添加ndk路径
ndk.dir=/home/zero/android_zip/android-ndk-r10e
- 8.build project,会在build/intermediates/classes/ndk下面查看到不同设备的.so动态库(windows下为.dll)
- 9.开始使用吧!
mJNITv = (TextView) findViewById(R.id.ndk_tv);
HelloClass jniFunc = new HelloClass();
mJNITv.setText(jniFunc.stringFromJNI());
- 运行无误,这里就不贴图了。
说明
defaultConfig {
applicationId "com.zero.ndk"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
ndk { // 注意添加这个配置,不然方法会显示红色,但运行不会报错
}
}
关于如何编写C函数就要靠自己去学习咯
为了使用JNI,专门定义了一套接口例如jstring替代String
使用目的
- 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大
- 提高应用程序的执行效率
- 使用现存的C/C++开源库
使用场景
- 加密处理
- 影音方面
- 图形图像处理