JNIEnv FindClass() 找不到属于 Xamarin Android 绑定库的 package/Class

JNIEnv FindClass() can't find package/Class that is part of a Xamarin Android Binding Library

我正在尝试通过 JNI 从 C++ 调用 Kotlin 函数。

Kotlin 函数位于 class 中,它是 Android 绑定库的一部分,附加到 Xamarin 应用程序。

C++ 代码位于同一个 Xamarin 应用程序的本机库中。

我用这行代码调用 FindClass():

 jclass classObj = m_env->FindClass("de/companyname/packagename/MyKotlinClass");

m_env 是指向 JNI 环境的有效指针(例如,我可以成功找到标准 Java 库 classes)。 上面的代码行失败

java.lang.ClassNotFoundException: Didn't find class "de/companyname/packagename/MyKotlinClass" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

在已签名的 apk 的 classes.dex 文件中,我可以看到具有正确路径的 MyKotlinClass。但是 JNI 不知何故找不到它。

这是因为 Kotlin class 是包含在 Android 绑定库中的 AAR 的一部分吗? 我该怎么做才能让 JNI 找到我的 class?

我找到了一个解决方案,方法是从 包含在 Android 绑定库 的 AAR 中的 C++ 代码中调用 FindClass()。然后我可以使用 dlopen 从我的主 C++ 模块调用这个 C++。

这对我来说是一个很好的解决方案,因为我控制了 AAR 的内容。如果您有第三方 AAR,我认为如果您将一个单独的 C++ .so 文件添加到您的 Android 绑定库中,它也会起作用,但我还没有测试过这种情况。