4

我知道已经有关于堆栈溢出这个错误的帖子,但是从我在 SO 和 Google 上找到的内容来看,这与我的问题并不相符。

我正在尝试运行我的应用程序,但是每当调用本机函数时,我的程序就会崩溃,并且我得到以下信息LogCat...

08-01 09:15:57.448: E/AndroidRuntime(16966): FATAL EXCEPTION: main
08-01 09:15:57.448: E/AndroidRuntime(16966): java.lang.ExceptionInInitializerError
08-01 09:15:57.448: E/AndroidRuntime(16966):    at my.eti.commander.MainMenu.initMain(MainMenu.java:241)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at my.eti.commander.MainMenu.onCreate(MainMenu.java:81)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.os.Looper.loop(Looper.java:130)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at android.app.ActivityThread.main(ActivityThread.java:3683)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at java.lang.reflect.Method.invoke(Method.java:507)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at dalvik.system.NativeStart.main(Native Method)
08-01 09:15:57.448: E/AndroidRuntime(16966): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load RelayAPI: findLibrary returned null
08-01 09:15:57.448: E/AndroidRuntime(16966):    at java.lang.Runtime.loadLibrary(Runtime.java:429)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at java.lang.System.loadLibrary(System.java:554)
08-01 09:15:57.448: E/AndroidRuntime(16966):    at my.eti.commander.RelayAPIModel$NativeCalls.<clinit>(RelayAPIModel.java:432)
08-01 09:15:57.448: E/AndroidRuntime(16966):    ... 15 more

这是我的Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
EXTRA_CFLAGS := -DANDROID
LOCAL_MODULE := RelayAPI
LOCAL_SRC_FILES := RelayAPI.c
include $(BUILD_EXECUTABLE)

这是我的 jni 文件夹的图片...只会使用 RelayAPI,stringstuff 是一个未使用的额外文件。

在此处输入图像描述

我将所有本机函数存储在一个单独的类中,以便可以静态调用它们。不过这不是问题,因为我一直在移动它们,但我只是认为这将是我完成它的最佳方式。

public static class NativeCalls {

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

    public native static byte InitRelayJava();

    public native static void FreeRelayJava();
}
4

5 回答 5

1

不应该使用包含 $(BUILD_SHARED_LIBRARY) 而不是包含 $(BUILD_EXECUTABLE)?

于 2012-08-01T13:36:32.300 回答
1

好吧,我已经通过了错误。上个月我问了一个不同的问题,在尝试解决这个问题时,这个错误消失了。它与将 my 设置environment PATH variable为 NDK 文件夹位置有关。这是指向更深入答案的链接。

于 2012-08-01T15:06:58.707 回答
1

确保在运行您的应用程序(使用该库)之前构建您的库ndk-build

于 2014-03-30T16:46:22.977 回答
0

BUILD_EXECUTABLE是错误的,这将构建一个可执行文件(提示,提示..)而不是共享库。当你使用时,System.loadLibrary(..)你必须使用BUILD_SHARED_LIBRARY. 如果它仍然不起作用,则可能是另一个错误,但使用BUILD_EXECUTABLE打算用作共享库的东西是错误的,即使它在某些情况下“可能”工作。

于 2012-08-02T14:27:58.573 回答
0

我也遇到了这个问题,但是对于我的情况,您必须将基于处理器的库添加到您的项目库文件夹中。如果您使用的是日食。

在此处输入图像描述

于 2017-04-07T06:40:28.850 回答