登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 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();

}//




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1