您的位置:
首页
>>
CLQ工作室开源代码
>> 主题: [android][ndk][严重] 如果参数是 long 或其他,当传入的参数是 jobject 时,一定要将 jobject 先转换成对应的参数类型
[回主站]
[分站链接]
您的位置:
首页
>>
CLQ工作室开源代码
>> 主题: [android][ndk][严重] 如果参数是 long 或其他,当传入的参数是 jobject 时,一定要将 jobject 先转换成对应的参数类型
[最新]
[回主站]
标题
[android][ndk][严重] 如果参数是 long 或其他,当传入的参数是 jobject 时,一定要将 jobject 先转换成对应的参数类型
clq
浏览(532) +
2022-03-05 22:23:05 发表
编辑
关键字:
[android][ndk][严重] 如果参数是 long 或其他,当传入的参数是 jobject 时,一定要将 jobject 先转换成对应的参数类型
今日在用模拟器测试一个 ndk 程序时意外有崩溃,这个程序已经良好运行多时。不太可能是代码哇一块造成。
最后测试下来发现是 ndk 的 jobject 参数传递给 java 的 long 时,无论是什么值,对方接收到的永远是一个随机数。看上去明显是内存混乱了,一般是某个东西释放不正确引起的。
最后的解决办法是传递参数前先先将 jobject 强制转换掉。似乎 ndk 对参数中的 jobject 会非常特殊的对待。在 ndk 中它的定义很简单,就是一个通用 void 指针,如下:
typedef void* jobject;
但 ndk 显然在涉及它的 c/c++ 端和 java 端做了特殊的处理。
其实关于 jobject 会 特殊情况的我早就碰到了,不过今天的这个更是诡异:它出现在某些模拟器上,而真机上都是正确的!
具体代码如下:
//设置蓝牙事件函数
void java_Blle_SetOnEvent(jobject blle, jlong func_c)
{
JNIEnv* env = g_java_functions_info.env;
clear_Java_Exception();
jclass class_ = (*env)->FindClass(env, "hpublic/Blle"); //这样才有提示 //写代码时临时用
jmethodID func = (*env)->GetStaticMethodID(env, class_, "SetEventFunc",
"(Lhpublic/Blle;JJ)V");
clear_Java_Exception();
//int i = (int)123;//func_c;
//long long i = (long long)func_c;
(*env)->CallStaticVoidMethod(env, class_, func, //注意,静态函数时第二个参数由对象变成了类
// 下面是参数
//blle, (jlong)blle, (jlong)func_c//(int)func_c
//blle, (jlong)blle, 444//func_c //这个在最新环境下会出错!
//blle, (jlong)blle, (jlong)444//func_c
//blle, 0, 0//func_c //没有 (jLong的强制转换,居然有某些编译环境下会导致传递的参数异常!即 SetEventFunc 中得到的参数会不是 0 !但我之前的 ndk 一直是正确有!)
////blle, (jlong)blle, (jlong)0//func_c //ok
//blle, blle, func_c //error 真机 ok,模拟器会崩溃!
blle, (jlong)blle, (jlong)func_c //最后正确的是这个
//blle, (jlong)blle, func_c //这个也可以,就是说 jobject 当做其他类型参数(比如 jlong)时一定要加强制转换!会引起不知所谓的错误!(至少最新 ndk 下是如此)
);
clear_Java_Exception();
}//
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.