我正在尝试创建一些简单的二进制文件,以从共享库libQREngine.camera.samsung.so中调用导出的函数
这是源代码:
#include <iostream>
extern "C" int Java_com_samsung_android_qrengine_QRBarcodeDecoder_getRecogObjectCount();
int main()
{
int test= Java_com_samsung_android_qrengine_QRBarcodeDecoder_getRecogObjectCount();
return 0;
}
这是我尝试编译和链接它的方式:
aarch64-linux-android29-clang++ -o test test.cpp -L./lib64 -lQREngine.camera.samsung -Wl,-rpath ./lib64
这是我收到的错误消息:
./lib64/libandroid_runtime.so: undefined reference to `jniThrowException@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniThrowNullPointerException@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetReferent@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetNioBufferBaseArrayOffset@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `JniInvocationCreate@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniThrowIOException@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniLogException@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetNioBufferBaseArray@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetFDFromFileDescriptor@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `JniInvocationDestroy@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `JniInvocationInit@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniThrowExceptionFmt@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `JNI_CreateJavaVM@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniThrowRuntimeException@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniSetFileDescriptorOfFD@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniCreateFileDescriptor@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetNioBufferPointer@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniGetNioBufferFields@LIBNATIVEHELPER_1'
./lib64/libandroid_runtime.so: undefined reference to `jniRegisterNativeMethods@LIBNATIVEHELPER_1'
我确实了解libandroid_runtime.so需要从“ libnativehelper.so”导入这些函数。当使用readelf -d ./lib64/libandroid_runtime.so
时,它也被写为依赖项。0x0000000000000001 (NEEDED) Shared library: [libnativehelper.so]
nm -D ./lib64/libnativehelper.so也显示这些功能存在于:
00000000000034f0 T jniThrowExceptionFmt
0000000000003570 T jniThrowNullPointerException
0000000000003f58 T jniGetReferent
0000000000003d18 T jniGetNioBufferBaseArrayOffset
00000000000050e8 T JniInvocationCreate
0000000000003590 T jniThrowIOException
0000000000003608 T jniLogException
0000000000003c30 T jniGetNioBufferBaseArray
依此类推,我故意遗漏了一些内容,以免将其扩大。Strace还显示在错误发生之前的某个时刻,libnativehelper.so正在打开和关闭。
现在我不明白,即使链接器存在于libnativehelper.so中并且该文件位于./lib64/之内,为什么链接器也不使用这些功能?>
编辑:似乎这与libnativehelper.so的符号版本化有关。正如您在上方看到的那样,函数“ jniThrowException”和“ jniThrowException @ LIBNATIVEHELPER_1”非常不同,这可能是链接程序不希望链接它们的原因。
我正在尝试创建一些简单的二进制文件,以从共享库libQREngine.camera.samsung.so中调用导出的函数,这是源代码:#include
是符号版本控制,它具有2个功能,其中一个预期为“ LIBNATIVEHELPER_1”版本,而libnativehelper.so即使提供这些功能也无法提供该版本。
我要做的就是通过Google的AOSP构建系统来编译libnativehelper.so(确保您在arm64中进行了编译),并获得了具有该版本的系统(通过grepping)