用于库加载的System.load

时间:2012-04-10 10:33:12

标签: android load java-native-interface

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

}
{p> stringFromCstringFromCpp存在.c.cpp个文件中,这些文件已编译为test_lib.so

3 个答案:

答案 0 :(得分:3)

我已经解决了我的问题。

有必要写

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

而不是

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

太奇怪了。如果我跑

adb shell 
ls /system/lib

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

答案 1 :(得分:0)

你需要将LOCAL_CPPFLAGS := $(YOURMODULE_CPPFLAGS)LOCAL_SRC_FILES := yourfile.cpp放在你的Android.mk文件中,用android NDK编译.cpp文件。

希望它会对你有所帮助。

答案 2 :(得分:0)

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

android 7.0 changes description