如何导入共享对象库在运行时的Andr​​oid? [英] How do I import shared object libraries at runtime in Android?

查看:108
本文介绍了如何导入共享对象库在运行时的Andr​​oid?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个开源模拟器项目,它有多种,可定制的本地插件。这些插件被构建为本地共享对象库(.so文件),并通过JNI本地和Java之间的各种接口。而不是分配APK每一个插件有史以来,为了让乡亲们建立自己的自定义插件,我需要进口这些文件的.so应用程序安装后的任何时间的方法。

I am developing an open-source emulator project, and it has multiple, customizable native plug-ins. These plug-ins are built as native shared object libraries (.so files), and have various interfaces between native and Java through JNI. Rather than distribute the APK with every single plug-in ever created, and in order to allow folks to build their own custom plug-ins, I need a method of importing these .so files any time after the app has been installed.

我发现我可以将文件复制到该文件夹​​/数据/数据​​/ [程序包],而不是到lib /子文件夹(因为它是由系统集团所有)。为了利用Java中的JNI接口,我必须调用的System.loadLibrary(LIBNAME);然而,这似乎需要将位于lib /子文件夹中的.so文件。解决这个我能想到的唯一的办法就是需要用户有一个根深蒂固的设备。有另一种方式做到这一点?

I've found that I can copy files to the folder /data/data/[package_name], but not to the lib/ sub-folder (because it is owned by the "system" group). To utilize the JNI interfaces in Java, I must call System.loadLibrary( libname ); However, this seems to require the .so file to be located in the lib/ sub-folder. The only way around this I can think of is to require the user to have a rooted device. Is there another way to accomplish this?

推荐答案

使用System.load()代替:

Use System.load() instead:

static
{
    final String[] libs = {
        "/data/data/com.foo.test/lib/liba.so",
        "/data/data/com.foo.test/lib/libb.so"
    };

    for (int i=0; i<libs.length; ++i)
    {
        Log.d(TAG, "Loading " + libs[i] + "...");
        System.load(libs[i]);
    }
}

$亚行logcat

$ adb logcat

D / LibTest(1022):加载中... /data/data/com.foo.test/lib/liba.so结果
D / dalvikvm(1022):试图加载的lib /data/data/com.foo.test/lib/liba.so 0x40512640结果
D / dalvikvm(1022):增加了共享库/data/data/com.foo.test/lib/liba.so 0x40512640结果
D / dalvikvm(1022):无JNI_OnLoad在/data/data/com.foo.test/lib/liba.so 0x40512640发现,跳过初始化结果
D / LibTest(1022):加载中... /data/data/com.foo.test/lib/libb.so结果
D / dalvikvm(1022):试图加载的lib /data/data/com.foo.test/lib/libb.so 0x40512640结果
D / dalvikvm(1022):增加了共享库/data/data/com.foo.test/lib/libb.so 0x40512640结果
D / dalvikvm(1022):无JNI_OnLoad在/data/data/com.foo.test/lib/libb.so 0x40512640发现,跳绳的init

D/LibTest ( 1022): Loading /data/data/com.foo.test/lib/liba.so...
D/dalvikvm( 1022): Trying to load lib /data/data/com.foo.test/lib/liba.so 0x40512640
D/dalvikvm( 1022): Added shared lib /data/data/com.foo.test/lib/liba.so 0x40512640
D/dalvikvm( 1022): No JNI_OnLoad found in /data/data/com.foo.test/lib/liba.so 0x40512640, skipping init
D/LibTest ( 1022): Loading /data/data/com.foo.test/lib/libb.so...
D/dalvikvm( 1022): Trying to load lib /data/data/com.foo.test/lib/libb.so 0x40512640
D/dalvikvm( 1022): Added shared lib /data/data/com.foo.test/lib/libb.so 0x40512640
D/dalvikvm( 1022): No JNI_OnLoad found in /data/data/com.foo.test/lib/libb.so 0x40512640, skipping init

这篇关于如何导入共享对象库在运行时的Andr​​oid?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆