【发布时间】:2018-09-14 16:23:42
【问题描述】:
我正在尝试了解 android studio 如何处理共享库“.so”文件。他们简单的带有 C++ 的 Hello World 工作正常,但我正在努力将大量 C++ 代码移植到 android 并想了解最简单的方法。我不一定想将 CMakeLists.txt 文件添加到 Android Studio,因为某些代码不是使用 cmake 构建的。
我所做的是在 Android Studio 中创建了两个项目。支持 C++ 的 Hello World CPP,它运行良好。我还创建了一个 Hello World Java(没有 C++)支持。
我的目标是获取在 Hello World CPP 项目中创建的 libnative-lib.so 文件,将它们复制到 Hello World Java 并更改 Java 代码以引用 stringFromJNI() 函数。
在 Java 版本中,我创建了 apps/src/main/jniLibs 目录,并从 CPP 版本复制了整个目录 ./app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/。这些是我带来的文件。
~/AndroidStudioProjects/HelloJava/app/src/main/jniLibs$ ls -R .: arm64-v8a armeabi-v7a x86 x86_64
./arm64-v8a: libnative-lib.so
./armeabi-v7a: libnative-lib.so
./x86: libnative-lib.so
./x86_64: libnative-lib.so
然后我回到Java版本中的MainActivity类并复制了
static {
System.loadLibrary("native-lib");
}
并将以下内容添加到 onCreate 的末尾。 (我将 ID 添加到布局中,因此 R.id.sample_text 有效。)
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
构建工作正常,但当我尝试在 AVD 上运行时,我收到以下错误。
E/.gary.hellojav: No implementation found for java.lang.String com.example.gary.hellojava.MainActivity.stringFromJNI() (tried Java_com_example_gary_hellojava_MainActivity_stringFromJNI and Java_com_example_gary_hellojava_MainActivity_stringFromJNI__)
D/AndroidRuntime: Shutting down VM
我删除了 stringFromJNI 调用,它在 AVD 中运行良好。我已将 loadLibrary 调用中的库名称更改为无效的内容,并且 loadLibrary 引发异常,因此它似乎找到了库,但我无法完全正确地解析 stringFromJNI 名称。
我有什么建议或明显的疏忽吗?
【问题讨论】:
标签: java c++ android-studio shared-libraries