java - 使用 JNI 时如何摆脱 LD_PRELOAD

标签 java java-native-interface

我有 JNI 库 libA.so,它依赖于 C 库 libB.so。

在 Java 中,解决“符号查找错误”的一种方法是:

class A{
    public native void g();
    static{
        System.load("/asdfghjk/libA.so");
    }
}

然后运行java程序

LD_PRELOAD=libB.so

但是,这个 hack 不能在生产系统中使用,例如当程序使用 Tomcat JSF 部署时。

以下“解决方案”不起作用:

class A{
    public native void g();
    static{
        System.load("/asdfghjk/libB.so");
        System.load("/asdfghjk/libA.so");
    }
}

它产生一个错误:

symbol lookup error: /blah/... undefined symbol: _ZNblahblahblah...

最佳答案

该错误是因为它找不到您的共享库所依赖的库。

您应该将依赖库的位置添加到您的java.library.path中,首先以正确的顺序显式地System.load它们,或者以某种方式使用dlopen 系统调用来加载依赖项。

这个问题可能会有所帮助:Java: load shared librariees with dependencies

关于java - 使用 JNI 时如何摆脱 LD_PRELOAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952189/

相关文章:

java - 通过 Spring 创建的 H2 服务器数据库无法访问

java - 如何使用 C++ 制作 Java JNI KeyListener

java - Windows 从命令行添加到路径

Javah 工具错误 : Could not find class file for hellojni

安卓 JNI 错误 : warning: initialization makes integer from pointer without a cast

java - "Native library location"条目在 Eclipse 中有什么作用?

android - 停止/取消执行 FFmpeg 命令

java - 如果进程在外部被杀死则处理

java - 编译器如何处理注释?

java - 正确的逻辑从牌组中随机选择一张牌,直到所有牌都被选中