Android Stduio 下NDK 開發規則

android stduio 下NDK 開發規則介紹

一、類型轉換表格

表1-1 基礎數據類型的轉換關係表

Java Native類型 符號屬性 字長
boolean jboolean 無符號 8位
byte jbyte 無符號 8位
char jchar 無符號 16位
short jshort 有符號 16位
int jint 有符號 32位
long jlong 有符號 64位
float jfloat 有符號 32位
double jdouble 有符號 64位

表1-2 Java引用數據類型的轉換關係表

Java引用類型 Native類型 Java引用類型 Native類型
All objects jobject char[] jcharArray
java.lang.Class jclass short[] jshortArray
java.lang.String jstring int[] jintArray
Object[] jobjectArray long[] jlongArray
boolean[] jbooleanArray float[] jfloatArray
byte[] jbyteArray double[] jdoubleArrray
java.lang.Throwable jthrowable

二、常用類型介紹

2.1 JNIEnv結構體介紹
JNIEnv是一個與線程相關的代表JNI環境的結構體,圖2-1展示了JNIEnv的內部結構:
這裏寫圖片描述

                      圖 2-1 JNIEnv 內部結構圖

從上圖可知,JNIEnv提供了一些JNI系統函數,通過這些函數能夠操作jobject對象和調用java層的函數

2.2 用於操作java類的成員變量和成員函數的兩個函數分別是:

jfieldID GetFieldID(jclass clazz,const char *name,const char *sig);

jmethodID GetMethodID(jclass clazz,const char *name,const char *sig);

其中,jclass代表Java類,name表示成員函數或者成員變量的名字,sig爲參數類型+返回值信息

2.3 調用Java對象的函數和獲取對象字段

NativeType Call<type>Method(JNIEnv *env,jobject obj,jmethodID methodID,...)

其中typeJava函數的返回值類型,NativeType是本地對應的返回值類型

NativeType Get<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID)

void Set<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID,NativeType value)

其中typeNativeType與上述一樣,這裏的jfieldID就是從上面的GetFieldId中找到的。

表2-1 常用的Get/Set方法

Get方法 Set方法
GetObjectField SetObjectField
GetBooleanField SetBooleanField
GetByteField SetByteField
GetCharField SetCharField
GetShortField SetShortField
GetIntField SetIntField
GetLongField SetLongField
GetFloatField SetFloatField
GetDoubleField SetDoubleField

2.4 JNI類型簽名介紹

先來看一段動態註冊的代碼,如果要了解動態註冊的相關內容可以到
這裏

static JNINativeMethod gMethods[]={
 "stringFromJNI", //java層的函數名
 "()Ljava/lang/String;",  //(參數類型) 返回值類型,即JNI函數簽名
 (void *)stringFromJNI //本地庫對應的函數名
}

這個數組中的第二個參數正是我們需要了解的
本例對應的java函數爲 String stringFromJNI()
對應的JNI簽名爲

()Ljava/lang/String;
括號內是參數類型的標識,最右邊是返回值類型的標識,
返回類型是引用類型時,其格式爲 “L包名;”,上述例子的Ljava/lang/String;表示是一個Java String 類型

表2-2 類型標識示意表

類型標識 Java類型 類型標識 Java類型
Z boolean F float
B byte D double
C char L/java/lang/String; String
S short [I int[]
I int [L/java/lang/object; Object[]
J long

請初一,如果java類型是數組,則標識中會有一個 “[”,引用類型的標識最後都有一個 “;”

表2-3 函數簽名的小例子

函數簽名 Java函數
“()Ljava/lang/String;” String f()
“(Ljava/lang/String;I)J long f(String i,int c)
“([B)V” void f(byte[] bytes)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章