JNI开发之方法签名与Java通信(二),java面试题大汇总github

一般引用类型则为 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值