3

我有一个从 NativeActivity 派生的活动的 Android 应用程序,如下所示:

public class MyNativeActivity extends android.app.NativeActivity 
{
    public native void TellNativeSide(int info);

    static {
        System.loadLibrary("MyNatAct");  // <--- is this necessary?
    }

    public int OtherMethods(...) ...
}

在 C/C++ 方面,我有

extern "C" void  
Java_mycom_nativity_MyNativeActivity_TellNativeSide(JNIEnv *env,
    jobjectactivityobj, jint info)
{
    ... do something
} // java native TellNativeSide() method //

extern "C" jint JNI_OnLoad(JavaVM *vm, void *)
{
    LOGI("***JNI_OnLoad called...");
}

libMyNatAct.so 库由 NativeActivity 类自动加载,实际上是 android_main() 并且无论是否使用 system.loadLibrary() 行,一切都可以正常运行。但是,永远不会调用 JNI_OnLoad(),并且 TellNativeSide() 方法在 Java 端也不可用,除非

system.loadLibrary("MyNatAct");

call 存在于静态类初始化块中。

所以似乎本机 .so 必须加载两次。一次在 init 块中使所有本机方法可用并调用 JNI_OnLoad(),另一次由 NativeActivity 类而不是通过 system.loadLibrary()?

这是正确的行为吗?

4

1 回答 1

2

这是正确的。您必须显式调用system.loadLibrary()以将本机 Java 方法绑定到 .so 文件的导出函数

于 2015-04-05T09:58:39.453 回答