JNI编程需要注意的坑

本文记录了在Android JNI开发中遇到的问题,包括Java对象在JNI层被误识别为同一个对象,以及C++调用Java方法时参数类型匹配错误可能导致的Android平台异常。强调了类型匹配的重要性,并给出了错误示例和可能的后果。
摘要由CSDN通过智能技术生成

@[TOC]JNI编程需要注意的坑

Android Jni开发过程中遇到的一些问题,记录一下,以备后面参考

  1. Java代码向c++代码注册Java回调对象时,同一类型的不同对象,到了Jni代码里就都成一个值了,不同类型的对象是不是同一个值未验证
    比如以下Java代码
	RemoteCtrlApp app1;
	RemoteCtrlApp app2;
	RemoteCtrlApp app3;
	RemoteCtrlApp app4;

	TestRCtrlBase() {
		app1 = new RemoteCtrlApp();
		app2 = new RemoteCtrlApp();
		app3 = new RemoteCtrlApp();
		app4 = new RemoteCtrlApp();
	}

public static void main(String[] args) {
		//...		
		TestRCtrlBase inst = new TestRCtrlBase();
		
		int module_id1 = IRCtrlBaseModule.create_ctrl_base_module("66666666");
		IRCtrlBaseModule.register_ctrl_app(module_id1, inst.app1);
		IRCtrlBaseModule.register_ctrl_app(module_id1, inst.app2);
		
		int module_id2 = IRCtrlBaseModule.create_ctrl_base_module("88888888");
		IRCtrlBaseModule.register_ctrl_app(module_id2, inst.app3);
		IRCtrlBaseModule.register_ctrl_app(module_id2, inst.app4);

//...
}

到了c++层

JNIEXPORT jint JNICALL Java_cn_redcdn_IRctrl_IRCtrlBaseModule_register_1ctrl_1app
  (JNIEnv *env, jclass, jint base_module_id, jobject cb)
{
	printf("register_ctrl_app : %p\n",cb);
	//...
}

4个不同的java对象,到了c++层,都变成了同一个jobject对象

register_ctrl_app : 00000014891FF280
register_ctrl_app : 00000014891FF280
register_ctrl_app : 00000014891FF280
register_ctrl_app : 00000014891FF280
  1. c++调Java类方法时,实参类型一定要与形参(方法声明中的参数类型一致),不一致的情况下至少要保证参数长度一致(比如不要把long long 类型的实参传给java里int类型的参数),否则在windows平台下没问题,android平台会导致参数匹配错位,后面的参数匹配不对,可能报
    JNI ERROR (app bug): attempt to use stale global reference 0x2
    之类的错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸧蕻斝嚹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值