【问题标题】:Android NDK Runtime errorAndroid NDK 运行时错误
【发布时间】:2012-10-19 05:52:30
【问题描述】:

我已经关注了这个链接

How to link any library in ndk application

我的文件夹结构如下所示

项目(项目根目录)
|->src
|-->com.apparmtest
|--->主活动
|->jni
|-->Android.mk
|-->Application.mk
|-->AppARMTest.c
|-->com_apparmtest_MainActivity.h
|->我的库
|-->文件测试.h
|-->libFRead.so

而我的 Android.mk 文件内容是

Android.mk

LOCAL_PATH := $(call my-dir)


### include FileTest.so as a prebuilt lib ###

include $(CLEAR_VARS)


LOCAL_MODULE            := my-prebuilt-lib

LOCAL_SRC_FILES         := ../myLib/libFRead.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../myLib


include $(PREBUILT_SHARED_LIBRARY)

### end prebuilt###

include $(CLEAR_VARS)

LOCAL_MODULE    := AppARMTest

LOCAL_C_INCLUDES := $(LOCAL_PATH) \
                $(LOCAL_PATH)/../myLib

LOCAL_SRC_FILES := AppARMTest.c

LOCAL_LDLIBS := -llog

LOCAL_STATIC_LIBRARIES := my-prebuilt-lib

include $(BUILD_SHARED_LIBRARY)


and my Application.mk contains 


APP_MODULES := AppARMTest

APP_PLATFORM := ANDROID-8


and this project is compiling properly as well as ndk-build is not giving any error.

But while running on emmulator I am getting this error



    10-19 10:25:40.704: E/AndroidRuntime(334): FATAL EXCEPTION: main

    10-19 10:25:40.704: E/AndroidRuntime(334): java.lang.ExceptionInInitializerError

    10-19 10:25:40.704: E/AndroidRuntime(334):  at java.lang.Class.newInstanceImpl(Native Method)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at java.lang.Class.newInstance(Class.java:1409)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.app.Instrumentation.newActivity(Instrumentation.java:1021)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)


    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.app.ActivityThread.access$1500(ActivityThread.java:117)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.os.Handler.dispatchMessage(Handler.java:99)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at android.os.Looper.loop(Looper.java:123)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    android.app.ActivityThread.main(ActivityThread.java:3683)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at java.lang.reflect.Method.invokeNative(Native Method)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    java.lang.reflect.Method.invoke(Method.java:507)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at 

    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

    10-19 10:25:40.704: E/AndroidRuntime(334):  at dalvik.system.NativeStart.main(Native Method)

    10-19 10:25:40.704: E/AndroidRuntime(334): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]:    33 could not load needed library

    './obj/local/armeabi/libFRead.so' for 'libAppARMTest.so' (load_library[1104]: Library './obj/local/armeabi/libFRead.so' not found)

   10-19 10:25:40.704: E/AndroidRuntime(334):   at java.lang.Runtime.loadLibrary(Runtime.java:434)

   10-19 10:25:40.704: E/AndroidRuntime(334):   at java.lang.System.loadLibrary(System.java:554)

   10-19 10:25:40.704: E/AndroidRuntime(334):   at ivz.apparmtest.MainActivity.<clinit>(MainActivity.java:11)

   10-19 10:25:40.704: E/AndroidRuntime(334):   ... 15 more

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    这是一个运行时链接问题。运行环境找不到libAppARMTest.so需要的库libFRead.so

    这个问题在你执行ndk-build的时候不会出现,因为你已经在makefile中明确说明了libFRead.so的路径,所以编译工作正常。

    尝试确保 dalvik 能够在运行时加载 libFRead.so。您可能需要将库 libFRead.so 与 libAppARMTest.so 一起放在 libs/armeabi 文件夹中。

    【讨论】:

    • 谢谢你的朋友,我正在使用 Eclipse,在 Eclipse 项目资源管理器中,我看到在 libs/armeabi 和 obj/local/armeabi 文件夹中都有 .so 文件。如何解决此问题
    • 当您尝试使用 System.load(libFRead.so) 时会发生什么?是否能够加载独立的 .so 文件而不会抛出错误?
    • 我也测试过,它也给出了错误但有点不同的错误“10-19 14:53:05.588: E/AndroidRuntime(695): Caused by: java.lang.UnsatisfiedLinkError:无法加载 libFRead:findLibrary 返回 null"
    • 这个错误说明是你的运行环境找不到libFRead.so,(也是加载libAppARMTest.so失败的原因,因为它需要libFRead.so)。我不确定为什么它无法找到该库,因为它们存在于目录中。也许您可以尝试通过提供一些绝对路径来加载它,看看是否有效。
    • 是这样的吗? System.load((项目根目录)/myLib/libFRead.so)
    【解决方案2】:

    在MainActivity类的静态构造函数中调用loadLibrary()两次:

    static {
        System.loadLibrary("FRead");
        System.loadLibrary("AppARMTest");
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2012-03-24
      相关资源
      最近更新 更多