clang ++函数的未定义引用,即使它存在

问题描述 投票:0回答:1

我正在尝试创建一些简单的二进制文件,以从共享库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 extern“ C” int ...

android c++ linker clang++
1个回答
0
投票

是符号版本控制,它具有2个功能,其中一个预期为“ LIBNATIVEHELPER_1”版本,而libnativehelper.so即使提供这些功能也无法提供该版本。

我要做的就是通过Google的AOSP构建系统来编译libnativehelper.so(确保您在arm64中进行了编译),并获得了具有该版本的系统(通过grepping)

© www.soinside.com 2019 - 2024. All rights reserved.