如何解决Android - 即使在调用 loadLibrary 之后,也找不到本机方法的实现
我正在尝试使用 liboqs-java library。 liboqs 是一个可以为 Android 构建的 C 库,而 liboqs-java 是一个依赖于 liboqs 的 Java 包装器。
到目前为止我所做的:
- 将
c/
文件夹和java/
folder from liboqs-java 复制到我应用的src/main/
文件夹中。 - 使用 NDK 为 x86_64 Android 编译了 liboqs C 库。我已将
liboqs.so
复制到我应用的src/main/jniLibs/
文件夹中。
我的文件结构现在是什么样子:
在来自 liboqs-java 包装器的 Common.java
中,我调用了加载的 liboqs.so
库,它不会导致任何错误(如果没有找到该库,Java 会抛出错误):
public static void loadNativeLibrary() {
System.out.println("Loading liboqs.so for: " + Build.CPU_ABI + "...");
System.loadLibrary("oqs"); // This string is transformed to "liboqs.so"
}
但是在我的 MainActivity.java
中,我尝试使用 Java 包装器中的一些代码。这是我在 logcat 中看到的:
2021-01-19 10:32:23.388 10501-10501/io.trustwave.polarisclientapp I/System.out: Loading liboqs.so for: x86_64...
2021-01-19 10:32:23.389 10501-10501/io.trustwave.polarisclientapp E/olarisclientap: No implementation found for int org.openquantumsafe.Sigs.max_number_sigs() (tried Java_org_openquantumsafe_Sigs_max_1number_1sigs and Java_org_openquantumsafe_Sigs_max_1number_1sigs__)
2021-01-19 10:32:23.389 10501-10501/io.trustwave.polarisclientapp D/AndroidRuntime: Shutting down VM
2021-01-19 10:32:23.390 10501-10501/io.trustwave.polarisclientapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: io.trustwave.polarisclientapp,PID: 10501
java.lang.UnsatisfiedLinkError: No implementation found for int org.openquantumsafe.Sigs.max_number_sigs() (tried Java_org_openquantumsafe_Sigs_max_1number_1sigs and Java_org_openquantumsafe_Sigs_max_1number_1sigs__)
at org.openquantumsafe.Sigs.max_number_sigs(Native Method)
at org.openquantumsafe.Sigs.get_supported_sigs(Sigs.java:61)
at io.trustwave.polarisclientapp.MainActivity.testOQSSignatureGeneration(MainActivity.java:34)
at io.trustwave.polarisclientapp.MainActivity.onCreate(MainActivity.java:77)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2021-01-19 10:32:23.413 10501-10501/io.trustwave.polarisclientapp I/Process: Sending signal. PID: 10501 SIG: 9
据我所知,问题是 .c
和 .h
文件没有链接到 liboqs-java .java
文件,这会导致“找不到... 。“ 问题。 System.loadLibrary("oqs")
工作正常。
我没有修改任何 Android 项目文件,也没有做任何链接库的事情。我不知道从哪里开始这样做,或者我什至需要这样做。我注意到 Android 文档建议调用 c/
文件夹 cpp/
,但这没有效果。
Android 模拟器版本:API 30,x86_64
解决方法
因为我正在 Dart 中构建一个用于 Flutter 框架的库,所以我可能会为您提供部分答案。
第一个文件结构。如果它不存在,请添加一个 jniLibs 文件夹。里面包含每个 abi 的文件夹。
如果它不存在,请添加一个 CMakeLists.txt 文件并包含以下内容:
cmake_minimum_required(VERSION 3.4.1)
add_library(liboqs SHARED IMPORTED)
set_target_properties(liboqs PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/liboqs.so)
确保您的 build.gradle
文件中有以下内容。
android {
externalNativeBuild{
cmake {
path "CMakeLists.txt"
}
}
对于 Flutter 框架,我必须使用 Dart::ffi 注册 C 函数。 Java 库可能已经为您完成了这项工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。