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,...)
其中type是Java函數的返回值類型,NativeType是本地對應的返回值類型
NativeType Get<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID)
void Set<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID,NativeType value)
其中type和NativeType與上述一樣,這裏的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) |