gpt4 book ai didi

android - 是否需要显式调用 system.loadLibrary 来访问 NativeActivity 子类中的 native 方法?

转载 作者:行者123 更新时间:2023-11-29 01:34:15 26 4
gpt4 key购买 nike

我有一个 Android 应用程序,其中包含一个从 NativeActivity 派生的 Activity ,如下所示:

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");

调用在静态类初始化 block 中。

所以看来原生的.so要加载两次。一次是在 init block 中使所有 native 方法可用并调用 JNI_OnLoad(),另一次是通过 NativeActivity 类而不是通过 system.loadLibrary() 调用?

这是正确的行为吗?

最佳答案

没错。您必须显式调用 system.loadLibrary() 才能将 native Java 方法绑定(bind)到 .so 文件的导出函数

关于android - 是否需要显式调用 system.loadLibrary 来访问 NativeActivity 子类中的 native 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29453755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com