AS的JNI和NDK開發---入門篇

JNI 是什麼

1. jni----Java Native Interface的縮寫,中文便是java本地接口。
複製代碼

JNI做用是什麼

1.使得Java 與 本地其餘類型語言(如C、C++)交互
2.在 Java代碼 裏調用 C、C++等語言的代碼 或 C、C++代碼調用 Java 代碼
複製代碼

爲何要有JNI

背景:實際使用中,Java 須要與 本地代碼 進行交互
問題:由於 Java 具有跨平臺的特色,因此Java 與 本地代碼交互的能力很是弱
解決方案: 採用 JNI特性 加強 Java 與 本地代碼交互的能力
複製代碼

實現步驟

1.在Java中聲明Native方法(即須要調用的本地方法)
2.編譯上述 Java源文件javac(獲得 .class文件)
3.經過 javah 命令導出JNI的頭文件(.h文件)
4.使用 Java須要交互的本地代碼 實如今 Java中聲明的Native方法
4.1.如 Java 須要與 C++ 交互,那麼就用C++實現 Java的Native方法
5.編譯.so庫文件
6. 經過Java命令執行 Java程序,最終實現Java調用本地代碼
複製代碼

AS實現步驟

第一步 編寫代碼

在AS的項目中,src/main/java 新建一個類 JniTest(名稱按需求填寫)
裏面內容是(原生C++的方法)好比下:
 public native String java2C();
複製代碼

第二步 進行編譯

cmd 進入到 src/main/java 目錄下  執行如下命令
javah -d  ../jni 包名(如com.jni.test.JniTest) 回車
會生成一個jni文件夾下的.h文件(com_jni_test_JniTest.h)
複製代碼

第三步 編寫c/c++的源文件(方法名稱必須相同)能夠直接找寫C++的同事開發。

c++文件
 //引入剛纔生成的頭文件
 #include "com_jni_test_JniTest.h"

 //複製頭文件裏的要實現的方法名及其參數
 JNIEXPORT jstring JNICALL
 Java_com_jni_test_JniTest_java2C(JNIEnv *env, jobject instance) {
 //    實現這個方法,返回一個字符串
      return env->NewStringUTF("Hello from C++");
 }
複製代碼

第四步 從新進行rebuild project

在build/intermediates/ndk/debug/Android.mk 文件 copy出來放在jni目錄下
複製代碼

第五步 在moudle.gradle文件下配置

defaultConfig{
    ndk {
              moduleName "test"
              //so文件名,若是這裏配置了so文件名字,
              //記得更改Android.mk裏的LOCAL_MODULE :字段爲 LOCAL_MODULE := test 否則默認名字爲app 不同的話不生效
             // abiFilters "armeabi" //指定so文件所支持的CPU類型,若是不寫的話,會生成全部的CPU類型的so文件
         }
 }

 android{
  externalNativeBuild {
          ndkBuild {
               path "src/main/jni/Android.mk"//指定Android.mk路徑
          }
      }
 }
複製代碼

第六步 再次rebuild。

在build/intermediates/ndkBuild/debug/obj/local 生成各個平臺的so庫。
複製代碼

第七步 生成的庫文件是以 lib名字.so 命名的。

在最開始的java文件夾下的JavaTest類中 添加以下代碼:
 static{
  System.loadLibrary(「名字」);//注意 這裏的名字 不須要添加lib 直接寫你生成的so庫名字,也不須要後綴名。
 }
複製代碼

第八步 調用

在Activity中的調用裏面的方法  這樣就能實現java 與 c++的調用了。
複製代碼

配置長久命令到AS的方式

1,打開項目AS 打開設置界面
2.找到Tools/External Tools
3.點擊右上角的添加 彈出一個Create Tool的對話框
4.Name javah 
  desc:javah
  Program:$JDKPath$\bin\javah.exe
  Arguments: -d jni -classpath $ModuleFileDir$\src\main\Java $FileClass$
  Working directory: $ModuleFileDir$\src\main
點擊ok  點擊apply 點擊OK
5.在jni代碼類點擊右鍵  找到External Tools 裏面有一個你配置的javah 點擊
直接生成.h文件。
生層.h文件後面操做詳見上面生成代碼  後面步驟同上。
複製代碼

NDK是什麼

Native Development Kit,是 Android的一個工具開發包
JNI 與 NDK 無直接關係 ---- NDK屬於Android,JNI 屬於java
複製代碼

做用

快速開發C、 C++的動態庫,並自動將so和應用一塊兒打包成 APK
經過 NDK在 Android中 使用 JNI與本地代碼(如C、C++)交互
複製代碼

使用步驟(必須下載ndk包--能夠網上下載也能夠在AS下載)

配置 Android NDK環境
建立 Android 項目,並與 NDK進行關聯
在 Android 項目中聲明所須要調用的 Native方法
使用 Android須要交互的本地代碼 實如今Android中聲明的Native方法
好比 Android 須要與 C++ 交互,那麼就用C++ 實現 Java的Native方法
經過 ndk - bulid 命令編譯產生.so庫文件
編譯 Android Studio 工程,從而實現 Android 調用本地代碼
本人用的AS下載的版本AS版本3.4
複製代碼
相關文章
相關標籤/搜索