【问题标题】:System.load for library loadingSystem.load 用于库加载
【发布时间】:2017-09-08 10:44:41
【问题描述】:

我成功地从/system/libs/my_lib.so 目录加载了一个库。如何使用该库中定义的 C/C++ 函数?

public class MainFrom extends Activity {

    private static final String LOG_TAG = "MainFrom";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main); 
        // How to use the functions of test_lib.so? 

        /*
            java.lang.UnsatisfiedLinkError: stringFromC


        String s1 = stringFromC(), s2 = stringFromCpp();

        Log.w(LOG_TAG, stringFromC());   
        Log.w(LOG_TAG, stringFromCpp());  */
    }

    public native String stringFromC();
    public native String stringFromCpp();

    static {
        try { 
            System.load("/system/lib/test_lib.so");
            Log.i(LOG_TAG, "MainFrom. Success!");
        } catch (UnsatisfiedLinkError e) {
            Log.e(LOG_TAG, "MainFrom. UnsatisfiedLinkError");
        }
    }

}

stringFromCstringFromCpp 存在于编译为 test_lib.so.c.cpp 文件中

【问题讨论】:

  • 你能分享你的 Android.mk 文件以及 .c 和 .cpp 吗?
  • @NISHAnT 如何分享?我正在构建 Cyanogen,我的测试库在“external”文件夹中,c 和 cpp 函数的用法在“framesworks”文件夹中。
  • @NISHAnT 我可以在六个小时内分享它,因为我无法回答自己的问题(声誉低于 100),而且 cmets 中没有完整代码的位置。
  • 您好,您能告诉我如何将 test_lib.so 编译到 /system/libs/ 中吗?我已经尝试了一个星期。我的帖子在这里 [link]stackoverflow.com/questions/15910015/…,非常感谢!

标签: android load java-native-interface


【解决方案1】:

我的问题已经解决了。

有必要写

System.load("/system/lib/libtest_lib.so");

而不是

System.load("/system/lib/test_lib.so");

好奇怪。如果我运行

adb shell 
ls /system/lib

我会看到 test_lib.so 文件。为什么使用 lib 前缀加载库是正确的?

【讨论】:

  • 不,不需要使用 lib 前缀。如果你想使用来自 ANDROID_SOURCES/external/your_lib/ 的 JNI 函数,你应该调用它们 Java_com_your_pack_name_YourClass_yourJniMethod 并创建一个包含 System.load("/system/lib/test.so") 的静态初始化块
  • 我知道这是旧的,但你能解释一下你上面所说的吗?我正在尝试从 /storage (内部存储)中包含一个库
【解决方案2】:

您需要将LOCAL_CPPFLAGS := $(YOURMODULE_CPPFLAGS)LOCAL_SRC_FILES := yourfile.cpp 放入您的Android.mk 文件中以使用android NDK 编译.cpp 文件。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    从 Android 7.0 开始,系统会阻止应用动态链接到非 NDK 库,这可能会导致您的应用崩溃。这种行为改变旨在跨平台更新和不同设备创建一致的应用体验。

    android 7.0 changes description

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多