`
mmdev
  • 浏览: 13242639 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

调用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();
}
}

分享到:
评论

相关推荐

    exe4j - java可执行程序jar的生成工具,进而完成jar包转exe

    对于GUI应用,exe4j可以自动生成启动界面,等待Java虚拟机(JVM)加载完毕后显示应用程序窗口。对于命令行应用,exe4j则会提供一个简单的命令行接口。 exe4j提供了多种配置选项,例如指定JRE的版本、设置内存大小、...

    javajnative程序打包代码实例

    在本实例中,我们将探讨如何将这样的程序打包成JAR或EXE文件,以便于部署和执行。 首先,JNI是Java平台提供的一种标准方式,允许Java代码调用本地方法,这些方法可能存在于动态链接库(DLL)中。JNI提供了一种安全...

    Java调用Qt DLL

    10. **部署与运行**:在部署应用程序时,除了Java类和JAR文件外,还需要包含Qt DLLs以及C++编译生成的本地库。确保目标机器上安装了必要的运行时库。 通过以上步骤,Java应用能够利用Qt的强大功能,例如创建美观的...

    Java调用Win32获取窗口句柄JNative-1.3.2

    JNI是Java平台的标准部分,它为Java开发者提供了一种机制,可以在Java程序中直接调用本地(即非Java)代码。这样,开发者可以利用已有的C/C++库,或者利用这些语言的高效性能特性。JNI接口包括一系列的函数,用于...

    springboot 集成seetaface6JNI实现人脸检测识别

    在完成以上步骤后,你就成功地在SpringBoot应用中集成了SeetaFace6JNI,实现了高效的人脸检测和识别功能。这将有助于你在各种场景下,如安全监控、门禁系统或社交应用中,提供可靠的身份验证服务。记得在实际应用中...

    jacob的jar包和dll文件

    例如,如果你需要在Java程序中生成、编辑或者读取Word文档,`jacob.jar`就派上了用场。通过导入这个库,你可以轻松地创建、打开、修改Word文档,执行格式化、添加内容、读取数据等操作。 **dll文件的用途** `jacob...

    jnative.jar

    接着,通过JNI生成对应的C/C++代码,实现这个本地方法,并编译成动态链接库(DLL)。最后,将DLL与Java应用一起部署,Java代码就可以通过这个本地方法调用DLL中的函数了。 四、源码分析 JNative_1.4RC2_src.zip...

    一种无法被Dump的jar包加密保护解决方案.docx

    《一种无法被Dump的jar包加密保护解决方案》 在当今的软件开发领域,Java因其跨平台的特性及丰富的库资源而广受欢迎。然而,这也带来了代码安全的问题。Java的字节码格式相对简单,容易被反编译工具如JD-GUI解析,...

    JACOB_1.9(java导成word工具jar包)

    这个工具jar包是针对那些希望在不依赖第三方软件(如Apache POI)的情况下,利用Java实现Word文档生成的开发者设计的。 JACOB的核心功能是通过Java Native Interface (JNI) 来调用Windows平台的动态链接库(DLL),这...

    使用jsmooth打包jar.doc

    2. **JNI API**:JSmooth提供的JNI(Java Native Interface)API允许开发者从Java程序中直接调用Windows特有的功能,增强了Java应用程序的本地化能力。 3. **许可证**:JSmooth遵循GNU General Public License(GPL...

    jacob-1.19.zip(包含jar/x86dll/x64dll)

    在实际开发中,Jacob库的应用场景广泛,例如自动化Office文档的生成、处理和分析,或者与各种Windows应用程序进行数据交换。使用Jacob,开发者可以避免编写复杂的JNI(Java Native Interface)代码,简化了跨平台...

    jacob.jar + jacob.dll 1.7

    7. **兼容性问题**:需要注意的是,`jacob.dll`有不同版本,分别对应不同的Windows操作系统(如32位或64位),因此在部署时需选择正确的版本,以避免兼容性问题。 8. **错误处理**:使用Jacob时,可能出现的错误...

    Java项目制作可执行程序与安装程序.rar

    2. **JNA**:Java Native Access允许Java代码直接调用操作系统API,无需编写JNI(Java Native Interface)代码。这简化了与本地库的交互,如访问硬件特性或使用特定的操作系统服务。在我们的项目中,JNA可能被用来...

    重难点之Java调用动态库.pdf

    5. **部署和测试**:生成新的DLL文件并将其放在Java的`java.library.path`中。在Java代码中调用这些方法,进行测试。 JNI中,Java类型与C/C++类型之间有对应的映射,如Java的`int`对应C的`jint`,`String`对应`...

    centos-java-gdal.zip

    在Linux环境中,开发Java应用程序并使用GDAL(Geospatial Data Abstraction Library)进行地理空间数据处理时,有时需要创建本地方法接口(JNI)来利用C/C++编写的GDAL库。`centos-java-gdal.zip`文件包含了完成这一...

    android底层开发.pdf

    编译完成后,生成的APK、库文件和JAR包需要放置在Android系统的相应目录下,如`system/app`、`system/framework`和`system/lib/hw`,以便系统能够正确加载和运行。 综上所述,Android底层开发涵盖了从硬件驱动的...

    jacob1.14.3.jar和32位、64位dll

    当你在Java项目中使用Jacob时,需要将这个JAR文件添加到项目的类路径(classpath)中,以便能够编译和运行包含Jacob调用的代码。 **32位和64位DLL** Jacob的运行依赖于与系统架构匹配的动态链接库(DLL)文件。...

    jdk8-win 64位 7z包

    3. **Java Archive Tool (jar)**:用于创建和管理.jar文件,是Java程序的打包工具,可以将多个类文件打包成一个可执行的jar文件,便于分发和部署。 4. **Java Debugger (jdb)**:这是一个命令行工具,用于调试Java...

    jnative

    4. **JNI函数注册**:在C++的DLL或共享库中,需要使用JNI定义的函数注册表来声明和导出可供Java调用的函数。这些函数通常在C++代码中使用`JNIEXPORT`和`JNICALL`宏进行修饰,并通过`JNI_OnLoad`函数加载到JVM。 5. ...

    jnative下载

    5. **部署和运行**:将JNative.jar和对应的本地库与Java应用程序一起部署,运行Java程序时,JVM会自动加载本地库并执行本地方法。 总之,JNative是Java跨平台调用本地代码的重要工具,通过它可以无缝地集成Java和C/...

Global site tag (gtag.js) - Google Analytics