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 绑定库中,它也会起作用,但我还没有测试过这种情况。
我正在尝试通过 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 绑定库中,它也会起作用,但我还没有测试过这种情况。