3

我成功地从/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");
        }
    }

}

stringFromC并存stringFromCpp在于编译成的文件.c.cpptest_lib.so

4

3 回答 3

3

我已经解决了我的问题。

有必要写

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

代替

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

这么奇怪。如果我跑

adb shell 
ls /system/lib

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

于 2012-04-11T09:51:32.780 回答
0

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

希望它会帮助你。

于 2012-04-10T12:34:54.677 回答
0

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

android 7.0 更改说明

于 2017-09-08T00:49:39.870 回答