@[TOC]JNI编程需要注意的坑
Android Jni开发过程中遇到的一些问题,记录一下,以备后面参考
- 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
- c++调Java类方法时,实参类型一定要与形参(方法声明中的参数类型一致),不一致的情况下至少要保证参数长度一致(比如不要把long long 类型的实参传给java里int类型的参数),否则在windows平台下没问题,android平台会导致参数匹配错位,后面的参数匹配不对,可能报
JNI ERROR (app bug): attempt to use stale global reference 0x2
之类的错误