之前用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_traitsIcEEEEiP12BacktraceMapPKcPNS_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技術!
uj5u.com熱心網友回復:
解決了~~~轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/56198.html
標籤:Qt
