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++開源庫
使用場景
- 加密處理
- 影音方面
- 圖形圖像處理