NDK工具開發Jni,Android studio jni開發

NDK工具開發JNI

對於JNI的作用,我這邊就不詳細說明了,百度google 有很多這樣的介紹,這邊着重詳解AS使用NDK工具開發,調C的流程.

    1,創建工程

    2,創建native方法

  1. //該類的路徑在main目錄任意包下即可
  2. public class JniUtils {
  3.    public static native String getStringFromC();
  4. }

    3,  配置ndk的路徑,如果沒有自行到 http://www.androiddevtools.cn/ 下載,或者翻牆同步下,自動下載. 


    4,在app項目下gradle的 defaultConfig{ }內添加

  1. ndk {    
  2.  //生成的so名字
  3.   moduleName "JniDemo"  
  4. }

    5,項目的根目錄下找到 gradle.properties 添加語句

  1. android.useDeprecatedNdk=true

    6,到指定class包的根目錄下,使用jni編譯h 文件.

  1. //注意這裏是包的根目錄,而不是class文件的子目錄
  2. cd  class文件路徑/intermediates/classes/debug

  編譯h 文件:

  1. //緊接着上一步terminal 編譯 h文件
  2. javah  -jni com.relicemxd.jnidemo.ndk.JniUtils
  3. //你也可以指定編譯的h 文件到指定目錄
  4. javah  -d /這裏是app項目的路徑/JniDemo/app/src/main/jni -jni com.relicemxd.jnidemo.ndk.JniUtils

      7,複製剛生成的 .h文件到 mian/jni 下



 下面是.c文件的代碼實現:

  1. #include "com_relicemxd_jnidemo_ndk_JniUtils.h"
  2. //這裏是C代碼的實現
  3. JNIEXPORT jstring JNICALL Java_com_relicemxd_jnidemo_ndk_JniUtils_getStringFromC
  4.        (JNIEnv *env, jclass cls) {
  5.    return (*env)->NewStringUTF(env, "這是來自C的string !");
  6. }
     8,在activity代碼中加動態庫

          static{

                System.loadLibrary("JniDemo");//.so文件名,注意這裏的名字要與gradle的命名一致
          }
    9,調用native方法

 activity調用 native 就可以獲取c的輸出了.
    10,運行結果

歡迎star, 有問題可以issue.

demo : https://github.com/relice/JniDemo





注意問題:

錯誤1:未指定類.

原因: 

javah 命令執行條件是,包的路徑與終端執行的路徑一致(不可在子路徑下執行)

解決:

cd 進入的路徑要在class包下的根目錄




錯誤2: java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String

原因:

javah生成的頭文件與 main目錄下的頭文件不一致.

解決:

step1.則要重新clean project ->build project ,否則項目會有緩存,編譯照樣報錯的.

step2.javah -d 指定scr/mian目錄下生成頭文件 -jni 包名+類名




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