2016-09-23 33 views
0

解决不良DT_NEEDED位置我有一个预建图书馆(libprebuilt.so),并与库链接我的C程序(myprogram.c)。如何在Android的6

我遵循本教程(https://developer.android.com/ndk/guides/prebuilts.html),它适用于Android 5(API 22)设备。

这是我Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libprebuilt 
LOCAL_SRC_FILES := libprebuilt.so 
include $(PREBUILT_SHARED_LIBRARY) 
include $(CLEAR_VARS) 

LOCAL_MODULE := myprogram 
LOCAL_SRC_FILES := myprogram.c 
LOCAL_SHARED_LIBRARIES := libprebuilt 
include $(BUILD_SHARED_LIBRARY) 

然后我做了NDK-建立和文件夹库重命名为jniLibs。

这是我的java程序

try { 
    System.loadLibrary("prebuilt"); 
    System.loadLibrary("myprogram"); 
} catch (UnsatisfiedLinkError ule) { 
    Log.e("Error", ule.getMessage()); 
} 

然而,当我与Android测试6设备,它不工作,并提供以下错误。

dlopen failed: library "/my/build/machine/obj/local/armeabi/libprebuilt.so" not found 

我在Android 6的变化(https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html)是

此版本更新的动态链接程序的行为发现。动态链接器现在理解图书馆的soname和它的路径(公共bug 6670)之间的区别,soname的搜索现在已经实现。以前工作过的具有错误DT_NEEDED条目的应用程序(通常是生成计算机文件系统上的绝对路径)在加载时可能会失败。

所以,问题是,DT_NEEDED项不正确定位,并在我的本地构建机器路径myprogram负载libprebuilt.so。我能做些什么来解决它?

回答