發表文章

目前顯示的是有「JNI」標籤的文章

Android NDK

圖片
  首先要把NDK進行下載安裝 新增專案選擇C++字眼的專案類型 於安卓模擬器運行 就會看到打印C++ 字串結果 預設的JNI C++程式碼 src/main/cpp/native-lib.cpp 1 2 3 4 5 6 7 8 9 10 #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv * env, jobject /* this */ ) { std :: string hello = "Hello from C++" ; return env -> NewStringUTF(hello.c_str()); } java程式進入點 src/main/java/com/example/ndktest/MainActivity.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com . example . ndktest ; import androidx.appcompat.app.AppCompatActivity ; import android.os.Bundle ; import android.widget.TextView ; import com.example.ndktest.databinding.ActivityMainBinding ; public class MainActivity extends AppCompatActivity { // Used to load the 'ndktest' library on application startup. static { System ....

JNI (Java Native Interface)

圖片
  JNI (Java Native Interface) 是一種JAVA原生介面(本地接口) 也是JAVA去呼叫其他語言,例如:C/C++一個十分重要的橋樑。 藉由JNI技術可實踐 1.java程式中函數可以去呼叫Native語言(C/C++)寫的函數 2.Native語言(C/C++)寫的函數也可以呼叫JAVA層級的函數 JNI一開始要達成的目的就是 1.統一兩者間的Data Type 所有引用的類型於JNI中都被定義為jobject的類型,在C中則都被定義為void* 關於Java數組類型映射到JNI的類型,比如, Java端的int[]類型對應於JNI側的jintArray Java端的char[]類型對應於JNI側的jcharArray Java端的String[]類型則對應於JNI側的jobjectArray類型。 2.函數簽章(名) JNI層提供了一套類型簽名(type signature)機制 有了類型之間的映射關係之後還不夠,因為我們知道Java中的方法是可被重載的(overloadable),為了要準確描述一個方法,既要獲得該方法的種類(類方法還是實例方法),還要獲得它的名稱(即方法標識符)以及類型(包括參數類型以及返回類型)。在JNI層可以通過後續要描述的接口來指定訪問的是類方法還是實例方法。 而要表示方法或屬性的類型 Java端的long類型,其簽名為:J; (備註:這裡的前綴大寫字母L,最後的分號也注意別漏, 簽名中包名與類名的分隔符用的是/符號 ) Java端的String類型,其簽名為:Ljava/lang/String; Java端的short[]類型,其簽名為:[S; Java中的String[]類型,其簽名為:[Ljava/lang/String; 而對於Java的方法類型簽名,則需要其完整的參數類型與返回類型。 如果沒有參數列表,則直接用()來表示。 Java端的() -> void類型,其簽名為:()V; Java端的(int) -> void類型,其簽名為:(I)V; Java端的(int, boolean) -> String類型,其簽名為:(IZ)Ljava/lang/String; Java端的(int, String, int) -> int[]類型,其簽名為:(ILjava/lang...