- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java VM 在执行 JNI 函数时出现“符号查找错误”怎么办?符号查找错误不在支持 JNI 接口(interface)的主要共享对象库中,也不直接在链接到主要对象库的库中,而是在链接到链接到 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 接口(interface)从 SDK 执行“InitializeLibrary”和“FinalizeLibrary”函数,因此找到主要的 libatcore.so 库或我的 AndorC.so 库没有问题。 JNI 的基本设置似乎没有任何问题。但是,当我尝试为相机执行“打开”功能(即实际连接到真实和/或模拟相机的功能)时,我在 libatcore.so 库使用的库之一中收到 undefined symbol 错误运行时(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
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 => /usr/lib64/libstdc++.so.6 (0x00007f7e6af31000)
libm.so.6 => /lib64/libm.so.6 (0x00007f7e6acac000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7e6aa96000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7e6a717000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)
ldd libatdevsimcam.so
linux-vdso.so.1 => (0x00007fff247ef000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5219dc4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5219bbf000)
librt.so.1 => /lib64/librt.so.1 (0x00007f52199b7000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f52196b0000)
libm.so.6 => /lib64/libm.so.6 (0x00007f521942b000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5219215000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5218e96000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)
nm libatdevsimcam.so | grep _ZN20TAndor
U _ZN20TAndorLibDebugOutput6OutputEPKciS1_xx24TAndorDebugFunctionLevel16TAndorDebugLevelS1_z
最佳答案
您可以通过使用 LD_PRELOAD 来摆脱它(但我认为这不是一个合适的解决方案)
故事
我遇到了同样的问题,我的情况是......
*javaHelloWorldApp.java --> JNI_Hello_world.c --> 这个原生的c 函数调用snmp 库*java: symbol lookup error: /home/source/bin/libmytest.so: undefined symbol: init_snmp
我使用了 LD_PRELOAD,如图所示 here并暂时解决问题。export LD_PRELOAD=/usr/local/lib/libnetsnmp.so.30
未解决问题
ldd 给出,(注意,没有对 snmp 库的引用)
ldd ../libmytest/bin/libmytest.so linux-gate.so.1 => (0xb7777000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a3000) /lib/ld-linux.so.2 (0xb7778000)
export LD_PRELOAD=/usr/local/lib/libnetsnmp.so.30
我看到了对 snmp 的引用,
linux-gate.so.1 => (0xb770c000)
/usr/local/lib/libnetsnmp.so.30 (0xb763a000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb746c000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7462000)
libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xb72b7000)
/lib/ld-linux.so.2 (0xb770d000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb729c000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7297000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb7281000)
gcc -fPIC -shared -o ./bin/libmytest.so -I/usr/lib/jvm/java-6-openjdk-i386/include/ -I/usr/lib/jvm/java-6-openjdk-i386/include/linux -static -lc JNI_Hello_world.c
-L/usr/local/lib -lnetsnmp
, 没有任何影响,所以我从编译中删除。
gcc -c -fPIC ./mytest.c -o mytest.o -I$(JAVA_INC_PATH) -I$(JAVA_INC_PATH)linux
gcc -shared -o ./bin/libmytest.so mytest.o -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lnetsnmp
关于java-native-interface - Linux 上共享库中的 JNI "symbol lookup error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558909/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!