【问题标题】:Failure to get ref to NativeActivity subclass from C++无法从 C++ 获取对 NativeActivity 子类的引用
【发布时间】:2013-08-22 13:33:15
【问题描述】:

我正在使用从 NativeActivity 派生的 Java 类编写本机应用程序。我需要在我的 C++ 代码中获取对该类的引用,但是当我尝试在从 ANativeActivity_onCreate 调用的代码中执行此操作时,找不到该类。我的代码看起来像:

void ANativeActivity_onCreate(ANativeActivity *activity,
        void *savedState, size_t savedStateSize)
{
    ...
    JNIEnv *jenv = activity->env;
    dsActivityClass = jenv->FindClass("uk/co/realh/hgame/HGameActivity");
    if (!dsActivityClass)
    {
        // Log error and return to Java
    }
    ...
}

我的 logcat 显示 if 子句打印的错误,然后是 java.lang.NoClassDefFoundError 报告。

我已经仔细检查了类名,我确定它是正确的。并且在调用上述代码时该类必须已实例化,因为它包含一个用于加载 gnustl_shared 的静态代码块,没有它,Android 无法加载包含ANativeActivity_onCreate 的我的主库。什么可能导致找不到类?它是这样定义的:

package uk.co.realh.hgame;

import android.app.NativeActivity;
...

public class HGameActivity extends NativeActivity {
...
}

【问题讨论】:

标签: android-ndk java-native-interface native-activity


【解决方案1】:

根据 fadden 发布的链接 (1),创建本机线程可能会导致类加载器无法找到您的类。因此,从单独的线程调用 ANativeActivity_onCreate 似乎是解决此问题的最可能的解释。

在这种情况下,有一个简单的方法可以解决这个问题:

dsActivityClass = jenv->GetObjectClass(activity->clazz);

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 2011-11-09
    • 2020-08-14
    • 1970-01-01
    • 2013-12-20
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多