JNI编程需要注意的坑

@[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
    之类的错误

你可能感兴趣的:(java,android,开发语言)