【问题标题】:Android dynamic library load vs. LoadLibraryAndroid 动态库加载与 LoadLibrary
【发布时间】:2014-06-12 02:16:50
【问题描述】:

当我在我的应用程序中嵌入 libabc.so 时,它可以正常工作 System.LoadLibrary("abc");

但是,当我将 libabc.so 移动到 /system/lib/ 并尝试使用 System.Load("/system/lib/libabc.so"); 我在 logcat 中收到以下链接器错误:

06-12 04:42:09.864: D/dalvikvm(17630): 试图加载 lib /system/lib/libabc.so 0x4254afd8

06-12 04:42:09.869: E/linker(17630): "libabc.so": 忽略共享库中的 2-entry DT_PREINIT_ARRAY!

06-12 04:42:09.869: D/dalvikvm(17630): 添加共享库 /system/lib/libabc.so 0x4254afd8

06-12 04:42:09.869: D/dalvikvm(17630): 在 /system/lib/libabc.so 0x4254afd8 中找不到 JNI_OnLoad,跳过初始化

它实际上加载了我的库,但我无法调用导出的函数(它表明未实现本机方法)。

为什么?

【问题讨论】:

  • 顺便说一下,当你将libabc.so移动到/system/lib/时,你仍然可以用System.loadLibrary("abc");加载它
  • 可能是应用包名变了?
  • 没有。相同的应用程序。只是改变功能和重建。我意识到从 /data/app-lib/myappname/ 加载的所有内容都很好,但从其他地方加载它就无法正常工作......为什么?
  • 更改哪个功能?正如我所写,您可以使用System.loadLibrary("abc")/system/lib/ 加载。
  • 我知道,它确实加载了库。但我不能调用导出的函数。好像它们没有实施。唯一可行的方法是从 /data/app-lib/myappname/ 加载库

标签: android android-ndk


【解决方案1】:
public class TestService extends IntentService {

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

    private Handler handler = new Handler();

    public native long myfunc(String arg);

    public TestService() {
        super("TestService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        runnable.run();
    }

    private Runnable runnable = new Runnable() 
    {
        public void run() 
        {
            System.out.println(">>> " + myfunc("test"));
        }
    };
}

【讨论】:

  • 您找到解决此错误的方法了吗?我有同样的问题。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多