相关疑难解决方法(0)

Linux上的共享库中的JNI"符号查找错误"

当Java VM在执行JNI函数时出现"符号查找错误"时,您会怎么做?符号查找错误不在支持JNI接口的主共享对象库中,也不是直接在链接到主对象库的库中,而是在链接到链接到JNI共享对象的库的库中?(这是一个令人难以置信的尴尬句子☺)特别是,当你不控制包含有问题符号的库的代码时你会怎么做?

我在使用JNI访问科学相机(Andor NEO CMOS)的SDK时遇到问题.我正在使用RHEL 6上的Netbeans C/C++插件创建一个共享库(AndorC.so),它基本上围绕摄像机SDK提供的方法创建JNI包装器.相机SDK提供了一组访问相机的方法,这些方法打包在共享对象库(libatcore.so)中.libatcore.so库使用一系列附加库,libatdevregcam.so(用于真实相机),libatdevsimcam.so(用于模拟相机),libatcl_bitflow.so(低级视频板驱动程序)等.

我已经广泛测试了相机SDK,我可以毫无困难地从C/C++访问相机.我已链接到从测试C程序(使用单独的头文件)实现JNI函数的共享库(AndorC),并且一切正常运行(即我可以读取图像并且程序正常完成).

我的Java代码可以通过JNI接口从SDK执行"InitializeLibrary"和"FinalizeLibrary"功能,因此找到主libatcore.so库或我的AndorC.so库没有问题.JNI的基本设置似乎没有任何问题.但是,当我尝试执行相机的"打开"功能(即实际连接到真实和/或模拟相机的功能)时,我在libatcore.so库中使用的一个库中得到一个未定义的符号错误运行时(libdevsimcam.so).

/usr/local/java/jdk1.7.0_03/jre/bin/java: symbol lookup error: /usr/local/lib/libatdevsimcam.so: undefined symbol: _ZN20TAndorLibDebugOutput6OutputEPKciS1_xx24TAndorDebugFunctionLevel16TAndorDebugLevelS1_z
Java Result: 127
Run Code Online (Sandbox Code Playgroud)

基本上,Java VM没有libatcore.so(即主库文件)的问题,并且找到关联的运行时库(/usr/local/lib/libatdevsimcam.so)没有问题,但它当它试图打开相机时,在该库中遇到一个未定义的符号(注意我实际打开真正的相机而不是模拟相机).

当我检查每个库(libAndorC.so,libatcore.so,libatdevsimcam.so)的依赖项时,我没有找到任何未定义的符号.显然,当程序直接从C/C++运行时,libatdevsimcam.so库中的未定义符号不是问题,但是当Java VM尝试加载libatdevsimcam.so时,它会导致问题.

 libAndorC.so
linux-vdso.so.1 =>  (0x00007fff507ff000)
libatcore.so.3 => /usr/local/lib/libatcore.so.3 (0x00007fe23a278000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe239f4a000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe239cc6000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe239ab0000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe239730000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe239513000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe23930f000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe239106000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)
libatcore.so
linux-vdso.so.1 =>  (0x00007fffd53ff000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7e6b645000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7e6b440000)
librt.so.1 => /lib64/librt.so.1 (0x00007f7e6b238000)
libstdc++.so.6 => …
Run Code Online (Sandbox Code Playgroud)

java-native-interface

10
推荐指数
2
解决办法
2万
查看次数

标签 统计

java-native-interface ×1