JNI數(shù)據(jù)類型
基本數(shù)據(jù)
Java基本數(shù)據(jù)類型與JNI數(shù)據(jù)類型的映射關(guān)系
Java類型->JNI類型->C類型
JNI的基本數(shù)據(jù)類型有(左邊是Java絮重,右邊是JNI):
boolean jboolean
byte jbyte
char jchar
short jshort
int jint
long jlong
float jfloat
double jdouble
void void
引用類型(對象)
String jstring
Object jobject
數(shù)組,基本數(shù)據(jù)類型的數(shù)組
byte[] jByteArray
對象數(shù)組
object[](String[])
native函數(shù)參數(shù)說明
每個(gè)native函數(shù),都至少有兩個(gè)參數(shù)(JNIEnv*,jclass或者jobject)宦焦。
1)當(dāng)native方法為靜態(tài)方法時(shí):
jclass 代表native方法所屬類的class對象(JniTest.class)咨堤。
2)當(dāng)native方法為非靜態(tài)方法時(shí):
jobject 代表native方法所屬的對象菇篡。
native函數(shù)的頭文件可以自己寫。
關(guān)于屬性與方法的簽名
一一喘、屬性的簽名
屬性的簽名其實(shí)就是屬性的類型的簡稱驱还,對應(yīng)關(guān)系如下:
尤其注意的是,類的簽名格式就是:
L完整包名;
其中完整包名用 / 代替.
末尾的 ; 不能省略
數(shù)組的簽名就是:
[類型簽名
其中,多為數(shù)組就用多個(gè)[
二议蟆、方法的簽名
獲取方法的簽名比較麻煩一些闷沥,通過下面的方法也可以拿到屬性的簽名。
打開命令行咐容,
javap -s -p 完整類名
我們通過as的terminal工具進(jìn)入到F:\MyApplication\app\build\intermediates\classes\debug>舆逃,然后輸入命令:
javap -s -p com.example.gyf.GyfJniTest
public class com.example.gyf.GyfJniTest {
public java.lang.String name;
descriptor: Ljava/lang/String;
public static int NUM;
descriptor: I
public com.example.gyf.GyfJniTest();
descriptor: ()V
public int getAdminName(int);
descriptor: (I)I
public static java.lang.String getUUID();
descriptor: ()Ljava/lang/String;
public native java.lang.String getNameFromC();
descriptor: ()Ljava/lang/String;
public native void getStaticNameFormC();
descriptor: ()V
public native int getMethodFromC();
descriptor: ()I
public native java.lang.String getStaticMethodFromC();
descriptor: ()Ljava/lang/String;
public native long accessConstructor();
descriptor: ()J
static {};
descriptor: ()V
}
其中,descriptor就是我們需要的簽名了戳粒,注意簽名中末尾的分號不能省略颖侄。
方法簽名的規(guī)律就是,括號不可以省略:
(參數(shù)類型簽名)返回值類型簽名
構(gòu)造方法和父類的訪問:
github地址:https://github.com/momoshusheng/baseJni