【问题标题】:Android NDK : JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find classAndroid NDK:JNI GetMethodID 调用了挂起的异常 java.lang.ClassNotFoundException:找不到类
【发布时间】:2019-09-13 12:44:10
【问题描述】:

我正在构建一个使用 NDK 和 Java 的 android 应用程序。 该应用程序在调试模式下运行良好。但是当我尝试构建发布 apk 时。它开始崩溃。 调试发布APK后发现

在应用程序中检测到 JNI 错误:调用 JNI GetMethodID 并挂起 异常 java.lang.ClassNotFoundException: 找不到类 "example.motion.MotionDetectionReturnValue"

这是我的 .cpp 类的问题

jobject object;
    jmethodID constructor;
    jclass cls;

    cls = env->FindClass("example/motion/MotionDetectionReturnValue");
    constructor = env->GetMethodID(cls, "<init>", "(DDDDDDD)V");
    object = env->NewObject(cls, constructor, avg.x, avg.y, totalFraction, bottomRightFraction, bottomLeftFraction, topRightFraction, topLeftFraction);

我应该将它附加到 java 线程或类似的东西。我试过了,但我没有得到它

我错过了什么? ..谢谢

【问题讨论】:

  • “我应该将它附加到 java 线程” 没有更多上下文就不可能说。如果对本机代码的调用源自 Java,并且您以这种方式获得了 JNIEnv*,那么您不应该自己附加线程。如果这是在纯本机线程上,则需要附加它。
  • 您应该阅读错误消息,而不是对附加到线程进行疯狂的猜测。你有一个ClassNotFoundExfeotuon。这有一个可预测的原因,与线程无关。显然FindClass() 失败了,您的代码省略了检测,而是继续进行,就好像没有错误一样。您必须对您进行的每个 JNI 调用进行错误检查并做出相应的反应。
  • @user207421 我找到了类似错误的答案:stackoverflow.com/a/44440800/7555345 ..这就是为什么我对将它附加到 Java 线程感到困惑..无论如何我认为我不会

标签: java android android-ndk


【解决方案1】:

调试版本和发布版本之间的典型区别在于后者开启了 ProGuard 混淆。这意味着许多类和方法的名称会自动更改。可能这就是 example.motion.MotionDetectionReturnValue 班级发生的事情。简单的解决方法是保留 JNI 中涉及的类和方法的名称,而不会混淆。见https://stackoverflow.com/a/24923279/192373

更先进的技术也可以保护这些类

【讨论】:

  • 这似乎是问题所在。是否有任何关于如何对本机方法进行混淆的链接?
  • 您应该关闭 C++ 代码中使用的 Java 类和方法的混淆。见stackoverflow.com/a/24923279/192373。实际上,本地方法的名称也不应该被混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2021-11-02
  • 2021-10-07
相关资源
最近更新 更多