NDK Samples [1] - hello-jni
NDK Samples目錄:ofollow,noindex">GoogleSamples - NDK Samples
專案地址:https://github.com/googlesamples/android-ndk/tree/master/hello-jni
說明文件:https://github.com/googlesamples/android-ndk/blob/master/hello-jni/README.md
該專案演示如何從Java呼叫C程式碼,使用cmake外掛編譯。
最低要求:
- Android+Studio/">Android Studio 版本大於 2.2
該專案演示瞭如何從Java程式碼呼叫C方法,並獲取返回值。
-
HelloJni :: stringFromJNI();
演示瞭如何從java層呼叫C層對應stringFromJNI的方法。
HelloJni
/* 該方法在hello-jni實現。 可以通過ctrl+滑鼠左鍵跳轉到c方法。 */ public native String stringFromJNI(); /* 該方法並沒有任何的實現,純粹展示了可以在同一個檔案定義多個native方法。 在IDE上顯示為紅色,提示沒有找到該方法的c實現方法。 呼叫會丟擲UnsatisfiedLinkError */ public native StringunimplementedStringFromJNI(); /* 要使用上述的native方法,需要先載入對應的動態庫,本例為載入hello-jni庫。 包中的動態庫會被pm解壓到 /data/data/[ packagename ]/lib 中。 */ static { System.loadLibrary("hello-jni"); }
hello-jni.c
/* 匯入jni.h java和c之間的互動基本由此實現,包括資料轉換,方法呼叫等。 */ #include <jni.h> /* stringFromJNI()的實現,返回一個包含平臺型別資訊的字串 */ JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) { // 根據平臺定義一個ABI巨集 ... return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); }
CMakeLists.txt
# 配置cmake最低版本要求 3.4.1 cmake_minimum_required(VERSION 3.4.1) # 使用指定的原始檔,生成連結檔案,並加入工程 # 此處則是: # 指定使用 hello-jni.c (同目錄下), # 生成 hello-jni 連結檔案, # 通過 SHARED 指定連結檔案為動態連結庫。 add_library(hello-jni SHARED hello-jni.c) # target_link_libraries要寫在add_library之後 # 為目標檔案連結其所需要的庫 # 注意,庫檔案的順序符合gcc連結順序的規則,即被依賴的庫放在依賴它的庫的後面 target_link_libraries(hello-jni android log)
相對簡單的專案,NDK開發的Hello World,只是編譯工具換成了Cmake。