一般引用类型则为 L + 该类型类描述符 + ; (注意,这儿的分号“;”只得是JNI的一部分,而不是我们汉语中的分段,下同)
例如:String类型的域描述符为 Ljava/lang/String;
对于数组,其为 : [ + 其类型的域描述符 + ;
int[ ] 其描述符为[I
float[ ] 其描述符为[F
String[ ] 其描述符为[Ljava/lang/String;
Object[ ]类型的域描述符为[Ljava/lang/Object;
多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组。例如:
int [ ][ ] 其描述符为[[I
float[ ][ ] 其描述符为[[F
方法描述符
将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符,规则如下: (参数的域描述符的叠加)返回类型描述符。对于,没有返回值的,用V(表示void型)表示。举例如下:
Java层方法 JNI函数签名
String test ( ) Ljava/lang/String;
int f (int i, Object object) (ILjava/lang/Object;)I
void set (byte[ ] bytes) ([B)V
二、JNI实现java与c/c++相互通讯
2.1、签名映射表
JNI获取Java类的方法和字段,都需要一个很重要的参数,就是Java类的方法和字段的签名。所以最好能够记住它们。
“Lfully-qualified-class;”->L类全名; 例如Java String类对应的签名是Ljava/lang/String;
“[type”->java数组的签名,例如int[]的签名
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
[I,java Stringg[]的签名是[Ljava/lang/String;
“(arg-types)ret-type”->(函数参数)返回值,()只是所有参数,ret-type是返回类型签名例如
void test(String msg)对应的签名是(Ljava/lang/String;)V
long f(int n,String s,int[] arr)对应的签名(Ijava/lang/String;[I)J
void f()对应用的签名()V
2.2、jni是如何访问java中的方法和字段
jni的native接口中,第一个参数为JNI接口指针(JNIEnv),第二个参数根据native方法是静态还是非静态而不同。非静态native方法的第二个参数是对该对象的引用,静态方法的第二参数是对其java类的引用。其与参数对应Java方法参数。
从上述描述中,如果是非静态的,我们可以拿到对象的引用。通过对象的引用,我们可以访问该对象的字段和方法。如果是静态的,我们可以访问该对象的静态方法和静态字段。那么jni中具体是如何访问的呢?我们将在下面的章节通过实例来介绍
2.3、jni访问java中的方法
java代码
public void show(String s){
Log.i(“MainActivity”,“show:”+s);
}
public native void showString(String s);
jni代码
//访问Java中的show方法
JNIEXPORT void JNICALL J