调用JNI的程序 生成JAR包后的部署问题

 编写调用JNI的Java程序,都会先将C/C++的代码编译成DLL或者SO格式。随之而来的就是部署的问题。
1.如果是制作bat文件启动程序,当然就简便了,在bat文件中,把DLL文件(以DLL为例)所在的路径加入到java lib path中即可。
2.如果只是生成一个jar包,两种方法可以考虑:
 1)让用户自己把DLL文件手动拷贝到java lib path中,或者添加一个path到DLL文件所在路径。此法对于开发人员来说相对简单,但是用户需要做很多额外操作。
 2)Java中自己写一些代码,程序首次启动时候将所需要的DLL文件拷贝到java lib path中。

有人可能会想到,在Java代码中利用System.setProPerty设置lib path,指向DLL所在路径。不过此法不可行,因为一旦Java虚拟机启动以后,lib path就是只读的,就不能再设置进去值了。所以,想改lib path,只能是在程序启动前,手动修改或者利用bat文件修改。

对于2),给出简单的示例代码如下:

    static {
        try {
            String libpath = System.getProperty("java.library.path");
            String path = null;
            StringTokenizer st = new StringTokenizer(libpath, System.getProperty("path.separator"));
            if ( st.hasMoreElements() ) {
                path = st.nextToken();
            }
           
            // copy all dll files to java lib path
            File dllFile = null;
            InputStream inputStream = null;
            FileOutputStream outputStream = null;
            byte[] array = null;
           
            dllFile = new File(new File(path), "JniCall.dll");
            if (!dllFile.exists()) {
                inputStream = DOMTree.class.getResource("/jni/JniCall.dll").openStream();
                outputStream = new FileOutputStream(dllFile);
                array = new byte[1024];
                for (int i = inputStream.read(array); i != -1; i = inputStream.read(array)) {
                    outputStream.write(array, 0, i);
                }
                outputStream.close();
            }
           
            dllFile = new File(new File(path), "libxml2.dll");
            if (!dllFile.exists()) {
                inputStream = DOMTree.class.getResource("/jni/libxml2.dll").openStream();
                outputStream = new FileOutputStream(dllFile);
                array = new byte[1024];
                for (int i = inputStream.read(array); i != -1; i = inputStream.read(array)) {
                    outputStream.write(array, 0, i);
                }
                outputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        try {
            // load JniCall.dll
            System.loadLibrary("JniCall");
        } catch (Error e) {
            e.printStackTrace();
        }
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值