【发布时间】:2020-02-10 10:53:28
【问题描述】:
我的 Android 项目中有一个 C++ 文件 (native-lib.cpp):
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_keysnative_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string api_key = "0123456789abcdef";
return env->NewStringUTF(api_key.c_str());
}
当我构建项目并解压apk时,这个文件将被编译成二进制:lib/x86/libnative-lib.so。
如果我尝试将此文件导入另一个项目并将其使用到另一个项目中,则会出现错误:
public class Main {
static {
try {
System.load("/Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so");
} catch (UnsatisfiedLinkError e) {
System.err.println(e);
System.exit(1);
}
}
}
java.lang.UnsatisfiedLinkError: /Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so: dlopen(/Users/u/Playground/KeysNative/app-debug/lib/x86 /libnative-lib.so, 1): 没有找到合适的图像。发现: /Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so:未知文件类型,前八个字节:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 /Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so:未知文件类型,前八个字节:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00
问题:这些文件是否使用要编译的项目中的 java keystore 或任何其他类型的签名?
【问题讨论】:
-
您尝试加载的文件是一个 ELF 共享对象,它可能还依赖于 Android 的某种自定义 libc 实现。从您的日志来看,您正试图在 MacOS 系统上加载此库,但这是行不通的,因为 MacOS 使用不同的动态库格式。
-
那么尝试在任何其他 android 应用程序中运行此共享对象文件是否可行? 5分钟后确认
标签: java android c++ android-ndk