gpt4 book ai didi

android - 未找到 JNI_OnLoad 跳过 init > 应用程序关闭

转载 作者:可可西里 更新时间:2023-11-01 18:44:53 26 4
gpt4 key购买 nike

各位,

我正在开发一个需要第三方 .so 库的 android 应用程序。我 build 了这个第三方库(带有 ndk-build)按照他们的说明,然后正在寻找将这个 .so 包含到我的 Android 项目中。

因此我按照 docs/PREBUILTS.html 中描述的步骤成功构建了在 jni/prebuilt 目录中新建 .so。现在我尝试通过在一个简单的测试 android 应用程序中使用它来利用 .so 设施。所以我做的是:

static {
Log.i("load so > ","load so");
System.loadLibrary("xyz");
}
/* The native functions */
private static native int openFile(String filename);

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try{
String path = getPathForDownloadDirectoryFile();
Log.i("file path> ", path);
int num= openFile(path);
}catch(Exception e){
Log.e(">", "could not open the file");
}
}

现在,当我运行我的应用程序时,我收到一条调试消息:在/data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738 中找不到 JNI_OnLoad,跳过 init然后应用程序关闭。

有关更多信息,这是错误日志:

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0,   skipping init
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I
D/AndroidRuntime( 570): Shutting down VM
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime( 570): FATAL EXCEPTION: main
E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method)
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31)
E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity

正如我所见,未找到 openFile() 方法的 native 实现,但相同的 xyz.so 库与来自第三方的原始示例应用程序一起工作得非常巧妙。我几乎是 Android-ndk 世界的初学者。

Java-Android-NDK Ninjas .. 猜猜我可能遗漏了什么?我将非常感谢这里的任何帮助:)

最佳答案

正如 guycole 所说“No JNI_OnLoad”只是一个警告,您的问题出在其他地方。

正如您提到的,您成功编译了“so”文件,问题可能在于您的 c/C++ 代码中的函数签名,它应该是这样的

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action

}

函数签名来自使用javah工具生成的头文件。您需要生成头文件并将函数签名与您的包名一起使用。对于不同的包名和类名,头文件和相应的函数签名会发生变化。

worked pretty neat with the original sample app from the third party

这可能是它在示例应用程序而不是您的应用程序上运行的原因。

引用:https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

关于android - 未找到 JNI_OnLoad 跳过 init > 应用程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12626067/

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