第一次嘗試使用 AS 調用JNI~

最近項目需要用到NDK編程,要學會如何在AS裏調用 jni ,走了不少坑,下面就把自己的心路歷程寫下來,做個記錄。
第一步,下載NDK ,建議下載 最新的包,android-ndk-r12b ,開始用了r10b的包編譯的時候有點問題,點擊下賊鏈接:點我點我
第二步,新建一個項目 NdkDemo,項目grade配置有點不一樣 下面看圖:
這裏寫圖片描述
這裏寫圖片描述
這裏gradle版本 不能用正常gradle編譯 ~·有待研究,這裏之前漏了,下文就找了半天的錯
第三步,新建一個類Test,看下代碼:

public class Test {
   public native  String  getMsg();
 }

報錯紅字 可以忽略 ,直接 make project. 通過了就行

在項目 app/build/intermediates/classes/debug 目錄下找到 剛纔生成的 class 文件,請注意不是.java
然後 cmd 命令 進入 這個目錄
這個命令的格式是 javah -classpath .-jni com.xxx.xx.Test
這裏寫圖片描述
如果看到 無輸出 東西 ,那就拍手鼓掌了,我一直是 下面那個圖
這裏寫圖片描述
這裏是關鍵點了,我試了好久 ,才發現 自己ClassPath環境沒配置,坑爹啊
第四步:上面通過的話 會生成com_xxx_xxx_Test.h的 C的頭文件
自己在app/main/java同級建一個jni文件夾,把上面的C文件 剪切過來,然後 建一個XXX.C文件 ,這個就是c的代碼庫 代碼如下

#include "com_live_ndkdemo_Test.h"
JNIEXPORT  jstring JNICALL Java_com_live_ndkdemo_Test_getMsg(JNIEnv *env,jobject obj){
    return (*env)->NewStringUTF(env,"我是來自 JNI");
}

做到這步,回過頭在把gradle配置文件 改下,Test類導入so庫 即可

 android.ndk {
        moduleName = "test"
        ldLibs += "log"
        abiFilters += "armeabi"
        abiFilters += "armeabi-v7a"
        abiFilters += "x86"
    }
public class Test {


   public native  String  getMsg();
   static {
      System.loadLibrary("test");
   }

}

然後自己編譯成 apk ,然後解壓下 就能看的 三個平臺so庫了~
——坑都是自己走出來才記憶深刻~待續

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