Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[功能建议] jni动态库支持调用方用System.load()方法自己加载 #69

Open
lrzl opened this issue Feb 2, 2023 · 5 comments

Comments

@lrzl
Copy link

lrzl commented Feb 2, 2023

现状

目前com.taosdata.jdbc.TSDBJNIConnector 类强制使用System.loadLibrary方法类加载jni动态库,代码如下:

/**
 * JNI connector
 */
public class TSDBJNIConnector {
    private static final Object LOCK = new Object();
    private static volatile boolean isInitialized;

    private final TaosInfo taosInfo = TaosInfo.getInstance();
    protected long taos = TSDBConstants.JNI_NULL_POINTER;     // Connection pointer used in C
    private boolean isResultsetClosed;      // result set status in current connection
    private int affectedRows = -1;

    static {
        System.loadLibrary("taos");
    }
...

问题

无法将jni动态库文件放入jar包内或其他配置目录来自由加载动态库,部署时必须要将动态库放到java.library.path内 或 将jni动态库文件所在目录指定到java.library.path,封装不够彻底,运维较麻烦

原因

java.library.path内的动态库只在jvm启动时加载,项目启动后无法加载(jdk11前可以用反射方式强制jdk重新加载至少在jdk17后不行)。

建议

在执行System.loadLibrary做一下判断,如果识别动态库已经载入jvm就不执行System.loadLibrary方法,封装者就能在使用TSDBJNIConnector前自己使用System.load方法加载动态库文件

@lrzl lrzl changed the title [功能建议] jni动态库加载相关 [功能建议] jni动态库支持调用方用System.load()方法自己加载 Feb 2, 2023
@codering
Copy link

codering commented May 8, 2023

对的,麻烦的要死。。。。。为什么不采用标准的 JNA 接口来加载,总是为难开发人员,维护升级也是要命。。

@jarrywen
Copy link

jarrywen commented May 24, 2023

在mac使用jdbc,无法使用System.loadLibrary("taos"),会报no taos in java.library.path的错误,
解决方案有:
1.改成System.load("/usr/local/lib/libtaos.1.dylib")就没问题了。
2.把libary拷贝到jre到目录:sudo cp /usr/local/libtaos.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_341.jdk/Contents/Home/jre/lib
3.java启动时候,加上参数:-Djava.library.path=<library_path>
注:第3点没验证过,但在程序中使用System.setProperty("java.library.path", "<library_path>");是不行的,因为classloader里面的路径变量不会从System.getProperty()取。

建议优化下代码

@lrzl
Copy link
Author

lrzl commented Jun 26, 2023

对的,麻烦的要死。。。。。为什么不采用标准的 JNA 接口来加载,总是为难开发人员,维护升级也是要命。。

官方一直不管,我现在都是改源码,把上述的

   static {
        System.loadLibrary("taos");
    }

去掉重新打个fix包自己用

@sangshuduo
Copy link
Contributor

对的,麻烦的要死。。。。。为什么不采用标准的 JNA 接口来加载,总是为难开发人员,维护升级也是要命。。

官方一直不管,我现在都是改源码,把上述的

   static {
        System.loadLibrary("taos");
    }

去掉重新打个fix包自己用

欢迎 PR

@KuuDS
Copy link

KuuDS commented Mar 13, 2024

对的,麻烦的要死。。。。。为什么不采用标准的 JNA 接口来加载,总是为难开发人员,维护升级也是要命。。

官方一直不管,我现在都是改源码,把上述的

   static {
        System.loadLibrary("taos");
    }

去掉重新打个fix包自己用

欢迎 PR

请问是否有Java的contribute规范

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants