找回密码
 立即注册
收起左侧

关于QtForAndroid中C++与Java互调的问题

1
回复
3133
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2020-3-11 09:19:05 显示全部楼层 |阅读模式
5Qter豆
之前用C++调用Java,只需要搞清楚Java和C++的类型对应关系,和callStaticMethod之类的函数调用即可,但是Java调用C++,我在《Qt On Android 核心编程》 书上看到作者说很简单,大体上是只需要定义java函数为native,然后C++定义一个多两个参数的对应函数,再关联即可,但可能Qt版本关系吧(作者用的是5.3版本,目前我用5.11和5.14),不管自己写还是用作者的例子,总是闪退,目前遇到的情况如下:
1、Qt的线程和Android主线程还不是同一个线程,所以两个线程分别应该在什么情况下使用?
2、registerNativeMethods()函数正确定义并正确返回,但调用后会导致部分C++调用Java函数闪退(如果不调用registerNativeMethods(),则没问题)。
3、Java调用Qt函数(作者的示例),调用完毕后会闪退,函数栈截取如下(这是5.14的错误,5.11的还不太一样,就是有个null 的object):

E art     : JNI ERROR (app bug): accessed deleted global reference 0x2008aa
F art     : art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: use of deleted global reference 0x2008aa
F art     : art/runtime/java_vm_ext.cc:470]     from java.lang.String an.qt.extendsQtWithJava.ExtendsQtNative.GetQtVersion()
F art     : art/runtime/java_vm_ext.cc:470] "main" prio=5 tid=1 Runnable
F art     : art/runtime/java_vm_ext.cc:470]   | group="main" sCount=0 dsCount=0 obj=0x759b96b8 self=0xf0a05400
F art     : art/runtime/java_vm_ext.cc:470]   | sysTid=27734 nice=-10 cgrp=default sched=0/0 handle=0xf381c534
F art     : art/runtime/java_vm_ext.cc:470]   | state=R schedstat=( 385390111 19337303 757 ) utm=21 stm=17 core=4 HZ=100
F art     : art/runtime/java_vm_ext.cc:470]   | stack=0xff4b4000-0xff4b6000 stackSize=8MB
F art     : art/runtime/java_vm_ext.cc:470]   | held mutexes= "mutator lock"(shared held)
F art     : art/runtime/java_vm_ext.cc:470]   native: #00 pc 003577e5  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMa**cPNS_9ArtMethodEPv+128)
F art     : art/runtime/java_vm_ext.cc:470]   native: #01 pc 00337dc1  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+304)
F art     : art/runtime/java_vm_ext.cc:470]   native: #02 pc 0023ba63  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+846)
F art     : art/runtime/java_vm_ext.cc:470]   native: #03 pc 0023c00f  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+66)
F art     : art/runtime/java_vm_ext.cc:470]   native: #04 pc 0033b81d  /system/lib/libart.so (_ZNK3art6Thread13DecodeJObjectEP8_jobject+240)
F art     : art/runtime/java_vm_ext.cc:470]   native: #05 pc 003fbf8f  /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8_jobjectjPNS_6ThreadE+30)
F art     : art/runtime/java_vm_ext.cc:470]   native: #06 pc 00000067  /data/app/an.qt.extendsQtWithJava-1/oat/arm/base.odex (Java_an_qt_extendsQtWithJava_ExtendsQtNative_GetQtVersion__+82)
F art     : art/runtime/java_vm_ext.cc:470]   at an.qt.extendsQtWithJava.ExtendsQtNative.GetQtVersion(Native method)
F art     : art/runtime/java_vm_ext.cc:470]   at an.qt.extendsQtWithJava.ExtendsQtWithJava$1.handleMessage(ExtendsQtWithJava.java:43)
F art     : art/runtime/java_vm_ext.cc:470]   at android.os.Handler.dispatchMessage(Handler.java:105)
F art     : art/runtime/java_vm_ext.cc:470]   at android.os.Looper.loop(Looper.java:156)
F art     : art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread.main(ActivityThread.java:6517)
F art     : art/runtime/java_vm_ext.cc:470]   at java.lang.reflect.Method.invoke!(Native method)
F art     : art/runtime/java_vm_ext.cc:470]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
F art     : art/runtime/java_vm_ext.cc:470]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
F art     : art/runtime/java_vm_ext.cc:470]   at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:107)


希望大家能多多交流,一起发扬Qt技术!         

回复

使用道具 举报

累计签到:7 天
连续签到:1 天
2020-3-12 10:43:01 显示全部楼层
已解决~hhhhhhhhh已解决~hhhhhhhhh
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了