NDK基本開發及適用場景

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++開源庫

使用場景

  • 加密處理
  • 影音方面
  • 圖形圖像處理

推薦教程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章