【发布时间】:2021-06-29 17:56:52
【问题描述】:
我有一个使用 my_app_helper.so 的库 my_app.so。
线
jclass jc = env->FindClass("com.my_app.flutter_app.MainActivity");
在my_app.so 的任何地方都可以完美运行,但会给出:
A/zygote64: java_vm_ext.cc:523] JNI DETECTED ERROR IN APPLICATION: JNI
NewGlobalRef called with pending exception java.lang.ClassNotFoundException:
Didn't find class "com.my_app.flutter_app.MainActivity" on path:
DexPathList[[dex file "InMemoryDexFile[cookie=[0,
547409613216]]"],nativeLibraryDirectories=[/system/lib64, /system/vendor/lib64]]
在my_app_helper.so
我的JNI_Onload 在my_app.so 上,它会将JavaVM *vm 传递给my_app_helper.so。
为什么在my_app_helper.so内部调用时找不到类?
更新:
这是回溯:
A/zygote64: java_vm_ext.cc:523] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.ClassNotFoundException: Didn't find class "com.my_app.flutter_app.MainActivity" on path: DexPathList[[dex file "InMemoryDexFile[cookie=[0, 547694828128]]"],nativeLibraryDirectories=[/system/lib64, /system/vendor/lib64]]
java_vm_ext.cc:523] at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
java_vm_ext.cc:523] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
java_vm_ext.cc:523] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
java_vm_ext.cc:523] at java.lang.Object com.rmsl.juce.JuceInvocationHandler.dispatchInvoke(long, java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) (JuceInvocationHandler.java:-2)
java_vm_ext.cc:523] at java.lang.Object com.rmsl.juce.JuceInvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) (JuceInvocationHandler.java:28)
java_vm_ext.cc:523] at java.lang.Object java.lang.reflect.Proxy.invoke(java.lang.reflect.Proxy, java.lang.reflect.Method, java.lang.Object[]) (Proxy.java:913)
java_vm_ext.cc:523] at void android.app.Application$ActivityLifecycleCallbacks.onActivityStarted(android.app.Activity) ((null):-1)
java_vm_ext.cc:523] at void android.app.Application.dispatchActivityStarted(android.app.Activity) (Application.java:207)
java_vm_ext.cc:523] at void android.app.Activity.onStart() (Activity.java:1249)
java_vm_ext.cc:523] at void io.flutter.embedding.android.FlutterActivity.onStart() (FlutterActivity.java:533)
java_vm_ext.cc:523] at void com.my_app.flutter_app.MainActivity.onStart() (MainActivity.kt:256)
java_vm_ext.cc:523] at void android.app.Instrumentation.callActivityOnStart(android.app.Activity) (Instrumentation.java:1355)
java_vm_ext.cc:523] at void android.app.Activity.performStart() (Activity.java:7001)
java_vm_ext.cc:523] at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2807)
java_vm_ext.cc:523] at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2923)
java_vm_ext.cc:523] at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
java_vm_ext.cc:523] at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1616)
java_vm_ext.cc:523] at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
java_vm_ext.cc:523] at void android.os.Looper.loop() (Looper.java:164)
java_vm_ext.cc:523] at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6617)
java_vm_ext.cc:523] at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
java_vm_ext.cc:523] at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
java_vm_ext.cc:523] at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:769)
java_vm_ext.cc:523]
java_vm_ext.cc:523] in call to NewGlobalRef
java_vm_ext.cc:523] from java.lang.Object com.rmsl.juce.JuceInvocationHandler.dispatchInvoke(long, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
java_vm_ext.cc:523] "main" prio=5 tid=1 Runnable
java_vm_ext.cc:523] | group="main" sCount=0 dsCount=0 flags=0 obj=0x72a3f710 self=0x7f93ec3a00
java_vm_ext.cc:523] | sysTid=21008 nice=-10 cgrp=default sched=0/0 handle=0x7f986549b0
java_vm_ext.cc:523] | state=R schedstat=( 583813855 313733548 562 ) utm=46 stm=11 core=1 HZ=100
java_vm_ext.cc:523] | stack=0x7ff863b000-0x7ff863d000 stackSize=8MB
java_vm_ext.cc:523] | held mutexes= "mutator lock"(shared held)
A/zygote64: java_vm_ext.cc:523] native: #00 pc 00000000003982fc /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+212)
【问题讨论】:
-
你从哪个线程调用
env->FindClass?调用堆栈是什么样子的? -
@esentsov 我用回溯更新了
-
不应该是
env->FindClass("com/my_app/flutter_app/MainActivity")吗?另外,你是从你自己用pthread_new或类似的线程创建的吗? -
@Botje 是的,事情正在新线程中发生。不是我控制的线程,但它们是。我应该附上线程吗?我不确切知道,但我想有一些关于将线程附加到某物的东西。如果我没记错,我试过了,但它没有用。是的,应该是
com/my_app/flutter_app/MainActivity,我打错了,但我写对了代码。
标签: android c++ java-native-interface