JNI数据类型
基本数据
Java基本数据类型与JNI数据类型的映射关系
Java类型->JNI类型->C类型
JNI的基本数据类型有(左边是Java,右边是JNI):
boolean jboolean
byte jbyte
char jchar
short jshort
int jint
long jlong
float jfloat
double jdouble
void void
引用类型(对象)
String jstring
Object jobject
数组,基本数据类型的数组
byte[] jByteArray
对象数组
object[](String[])
native函数参数说明
每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)。
1)当native方法为静态方法时:
jclass 代表native方法所属类的class对象(JniTest.class)。
2)当native方法为非静态方法时:
jobject 代表native方法所属的对象。
native函数的头文件可以自己写。
关于属性与方法的签名
一、属性的签名
属性的签名其实就是属性的类型的简称,对应关系如下:
尤其注意的是,类的签名格式就是:
L完整包名;
其中完整包名用 / 代替.
末尾的 ; 不能省略
数组的签名就是:
[类型签名
其中,多为数组就用多个[
二、方法的签名
获取方法的签名比较麻烦一些,通过下面的方法也可以拿到属性的签名。
打开命令行,
javap -s -p 完整类名
我们通过as的terminal工具进入到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就是我们需要的签名了,注意签名中末尾的分号不能省略。
方法签名的规律就是,括号不可以省略:
(参数类型签名)返回值类型签名
构造方法和父类的访问:
github地址:https://github.com/momoshusheng/baseJni
网友评论