【问题标题】:JNIEnv FindClass() can't find package/Class that is part of a Xamarin Android Binding LibraryJNIEnv FindClass() 找不到属于 Xamarin Android 绑定库的包/类
【发布时间】:2019-06-30 10:17:08
【问题描述】:

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

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

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

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

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

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

java.lang.ClassNotFoundException:在路径上找不到类“de/companyname/packagename/MyKotlinClass”:DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

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

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

【问题讨论】:

    标签: android xamarin.android java-native-interface


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多