Qt Android Native Error: JNI DETECTED ERROR IN APPLICATION: java_object == null

开发的qt android程序在低版本上运行正常,在高版本上启动时崩溃,报如下错误

复制代码
W  java.lang.RuntimeException: Can't create handler inside thread Thread[qtMainLoopThread,5,main] that has not called Looper.prepare()
   	at android.os.Handler.<init>(Handler.java:227)
   	at android.os.Handler.<init>(Handler.java:129)
   	at android.app.Activity.<init>(Activity.java:980)
   	at org.qtproject.qt.android.bindings.QtActivity.<init>(QtActivity.java:67)
   	at cn.pubwell.cons.ConsQtActivity.<init>(ConsQtActivity.java:58)
   	at org.qtproject.qt.android.QtNative.startQtApplication(Native Method)
   	at org.qtproject.qt.android.QtNative$7.run(QtNative.java:465)
   	at org.qtproject.qt.android.QtThread$1.run(QtThread.java:25)
   	at java.lang.Thread.run(Thread.java:1012)
A  java_vm_ext.cc:591] JNI DETECTED ERROR IN APPLICATION: java_object == null
   java_vm_ext.cc:591]     in call to GetObjectClass
   java_vm_ext.cc:591]     from void org.qtproject.qt.android.QtNative.startQtApplication()
D  Compat change id reported: 171228096; UID 10317; state: ENABLED
D  Compat change id reported: 193247900; UID 10317; state: DISABLED
A  runtime.cc:691] Runtime aborting...
   runtime.cc:691] Dumping all threads without mutator lock held
   runtime.cc:691] All threads:
   runtime.cc:691] DALVIK THREADS (42):
   runtime.cc:691] "main" prio=10 tid=1 Runnable
   runtime.cc:691]   | group="" sCount=0 ucsCount=0 flags=0 obj=0x71d226c0 self=0xb4000072732e8c00
   runtime.cc:691]   | sysTid=22682 nice=-10 cgrp=top-app sched=0/0 handle=0x72749274f8
   runtime.cc:691]   | state=R schedstat=( 613865508 70633029 567 ) utm=50 stm=11 core=6 HZ=100
   runtime.cc:691]   | stack=0x7fd5ccc000-0x7fd5cce000 stackSize=8188KB
   runtime.cc:691]   | held mutexes= "mutator lock"(shared held)
   runtime.cc:691]   native: #00 pc 0056f570  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack+176) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #01 pc 0068ffa8  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack const+344) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #02 pc 006ae5a8  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run+920) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #03 pc 00690f0c  /apex/com.android.art/lib64/libart.so (art::Thread::RunCheckpointFunction+188) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #04 pc 002a4534  /apex/com.android.art/lib64/libart.so (art::Thread::CheckSuspend+64) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #05 pc 00286b74  /apex/com.android.art/lib64/libart.so (art::ClassLinker::InitializeClass+1128) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #06 pc 00266518  /apex/com.android.art/lib64/libart.so (art::ClassLinker::EnsureInitialized+164) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #07 pc 00236018  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+35964) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #08 pc 00229bd8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #09 pc 0014dd26  /data/dalvik-cache/arm64/product@app@WebViewGoogle64@WebViewGoogle64.apk@classes.vdex (com.android.webview.chromium.WebViewChromiumFactoryProvider.addWebViewAssetPath)
   runtime.cc:691]   native: #10 pc 003db018  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute +452) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #11 pc 003e19b8  /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge+104) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #12 pc 003e2538  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+1760) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #13 pc 00230a58  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+14012) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #14 pc 00229bd8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #15 pc 00150408  /data/dalvik-cache/arm64/product@app@WebViewGoogle64@WebViewGoogle64.apk@classes.vdex (com.android.webview.chromium.WebViewChromium.<init>)
   runtime.cc:691]   native: #16 pc 003db018  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute +452) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #17 pc 003e19b8  /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge+104) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #18 pc 003e2538  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+1760) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)
   runtime.cc:691]   native: #19 pc 00230a58  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+14012) (BuildId: 43f5b252fbfc41f385c66b6a496e3d08)

网络上没有查找到有用信息,最终通过二分法找到了错误代码

复制代码
...
QJniEnvironment env;
QJniObject javaClass("cn/pubwell/cons/ConsQtActivity"); // 使用findclass似乎也有同样的问题
jobject objAct = qObjAct.object<jobject>();
jclass objectClass = env->GetObjectClass( objAct );
...
env->RegisterNatives(objectClass,
                         methods,
                         sizeof(methods) / sizeof(methods[0]));
...

上面的注册方式有问题,应当使用如下方式

复制代码
    ...
    QJniEnvironment env;
    jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());
    QJniObject qObjAct = QJniObject::callStaticObjectMethod(             
                                                          "com/example/ExampleActivity",
                                                            "getContext",
                                                            "()Landroid/content/Context;");

    if (!qObjAct.isValid())
    {
        return ;
    }

    jobject objAct = qObjAct.object<jobject>();
    jclass objectClass = env->GetObjectClass( objAct );

    env->RegisterNatives(objectClass,
                         methods,
                         sizeof(methods) / sizeof(methods[0]));
    ...

其中getContext为com/example/ExampleActivity.java的静态获取context函数

相关推荐
PenguinLetsGo5 分钟前
关于 Android16 MOPS 函数指令非法问题
android
花落人散处6 分钟前
SpringAI——接入高德MCP服务
java·后端
超浪的晨6 分钟前
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
java·开发语言·后端·学习·代理模式·个人开发
天天摸鱼的java工程师8 分钟前
🧠 MySQL 索引结构有哪些?优缺点是什么?【原理 + 场景实战】
java·后端·面试
java叶新东老师28 分钟前
idea提交时忽略.class、.iml文件和文件夹或目录的方法
java·开发语言
飞翔的佩奇34 分钟前
Java项目:基于SSM框架实现的社区团购管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
java·数据库·vue.js·毕业设计·mybatis·答辩ppt·社区团购
TDengine (老段)1 小时前
TDengine 转化函数 TO_TIMESTAMP 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Warren981 小时前
Java Collections工具类
java·开发语言·笔记·python·学习·oracle·硬件工程
java叶新东老师1 小时前
CMakelists.txt 实现多级目录编译
java·服务器·数据库
_风不会停息1 小时前
JDK1.8升级 JDK21 实践踩坑
java