我成功地从/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> stringFromC
和stringFromCpp
存在.c
和.cpp
个文件中,这些文件已编译为test_lib.so
答案 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库,这可能会导致您的应用崩溃。此行为更改旨在跨平台更新和不同设备创建一致的应用体验。