是否有必要显式调用 system.loadLibrary 以访问 NativeActivity 子 class 中的本机方法?
Is it necessary to call system.loadLibrary explicitly for accessing the native methods in a NativeActivity sub class?
我有一个 Android 应用程序,其中 activity 派生自 NativeActivity,如下所示:
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 class 和 android_main() 自动加载,无论有无 system.loadLibrary() 行,一切都可以正常运行。但是,永远不会调用 JNI_OnLoad() 并且 TellNativeSide() 方法在 Java 端也不可用,除非
system.loadLibrary("MyNatAct");
调用在静态 class 初始化块中。
所以好像原生的.so要加载两次。一旦在 init 块中使所有本机方法可用并调用 JNI_OnLoad(),另一次通过 NativeActivity class 但不是通过 system.loadLibrary()?
这是正确的行为吗?
没错。您必须显式调用 system.loadLibrary()
才能将本机 Java 方法绑定到 .so 文件
的导出函数
我有一个 Android 应用程序,其中 activity 派生自 NativeActivity,如下所示:
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 class 和 android_main() 自动加载,无论有无 system.loadLibrary() 行,一切都可以正常运行。但是,永远不会调用 JNI_OnLoad() 并且 TellNativeSide() 方法在 Java 端也不可用,除非
system.loadLibrary("MyNatAct");
调用在静态 class 初始化块中。
所以好像原生的.so要加载两次。一旦在 init 块中使所有本机方法可用并调用 JNI_OnLoad(),另一次通过 NativeActivity class 但不是通过 system.loadLibrary()?
这是正确的行为吗?
没错。您必须显式调用 system.loadLibrary()
才能将本机 Java 方法绑定到 .so 文件