Android NDK 应用程序无法加载库

2024-02-15

我的本机库代码:

#include <string.h>
#include <jni.h>

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
  return env->NewStringUTF("Hello from native code!");
}

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := libpacman
LOCAL_SRC_FILES := main.cpp
LOCAL_CFLAGS := -DANDROID_NDK
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

MainActivity.java:

public class MainActivity extends Activity {

    static {
        System.loadLibrary("libpacman");
    }

    // declare the native code function - must match main.cpp
    private native String invokeNativeFunction();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // this is where we call the native code
        String hello = invokeNativeFunction();

        new AlertDialog.Builder(this).setMessage(hello).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

库已成功编译,libpacman.so 位于 libs/armeabi 目录中,但 logcat 显示:

E/AndroidRuntime(13060): FATAL EXCEPTION: main
E/AndroidRuntime(13060): java.lang.ExceptionInInitializerError
E/AndroidRuntime(13060):    at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(13060):    at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(13060):    at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
E/AndroidRuntime(13060):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
E/AndroidRuntime(13060):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime(13060):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime(13060):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime(13060):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(13060):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(13060):    at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(13060):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(13060):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(13060):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(13060):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(13060):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(13060): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libpacman: findLibrary returned null
E/AndroidRuntime(13060):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime(13060):    at java.lang.System.loadLibrary(System.java:535)
E/AndroidRuntime(13060):    at com.example.pacman.MainActivity.<clinit>(MainActivity.java:11)
E/AndroidRuntime(13060):    ... 15 more
W/ActivityManager(  315):   Force finishing activity com.example.pacman/.MainActivity

因此,系统找不到该库,但如果解压 APK 文件 - 它位于 lib 目录中。为什么不在库中?

编辑。 好的,现在我修复了包名称:

jstring Java_com_wiagames_pacman_MainActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
  return env->NewStringUTF("Hello from native code!");
}

Android.mk 和 MainActivity.java 是相同的。到处都是 com.wiagames.pacman 包。但我收到错误:

E/AndroidRuntime(23084): FATAL EXCEPTION: main
E/AndroidRuntime(23084): java.lang.ExceptionInInitializerError
E/AndroidRuntime(23084):    at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(23084):    at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(23084):    at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
E/AndroidRuntime(23084):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
E/AndroidRuntime(23084):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime(23084):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime(23084):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime(23084):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(23084):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(23084):    at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(23084):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(23084):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(23084):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(23084):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(23084):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(23084): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libpacman: findLibrary returned null
E/AndroidRuntime(23084):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime(23084):    at java.lang.System.loadLibrary(System.java:535)
E/AndroidRuntime(23084):    at com.wiagames.pacman.MainActivity.<clinit>(MainActivity.java:13)
E/AndroidRuntime(23084):    ... 15 more
W/ActivityManager(  315):   Force finishing activity com.wiagames.pacman/.MainActivity

你的类名显然不是NdkFooActivity。还要确保您的 java 包是com.mindtherobot.samples.ndkfoo。本机函数的名称和调用它的 Java 上下文必须同步。通常您会生成本机标头javah -jni哪个有效在已经编译的类上,而不是java源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 应用程序无法加载库 的相关文章

随机推荐