如何把Windows,Linux和macOS的动态链接库封装到一个Java Jar包中

本文介绍了如何使用JNI、CMake和Maven将Windows、Linux和macOS的动态链接库封装到一个Java Jar包中,以实现跨平台的Dynamsoft Barcode Reader的Java调用。详细步骤包括创建Java类、使用CMake编译JNI库、配置Maven打包动态链接库和class文件,并解析加载Jar包中的库。
摘要由CSDN通过智能技术生成

通过JNI,我们可以让Java调用C/C++的库。C/C++的库是平台相关的。要让依赖JNI动态链接库的Java开发包跨平台,需要把各个平台的库都封装到一个Jar包里。这篇文章分享下如何基于Dynamsoft Barcode Reader,用CMake为Windows,Linux和macOS快速构建JNI动态链接库,以及如何用Maven把.class,.dll,.dylib,.so文件打包到Jar包中。

创建Java类,生成.h头文件

用Eclipse创建一个Maven工程:

创建NativeBarcodeReader.java

public class NativeBarcodeReader {
    
     
    private long nativePtr = 0;
 
    static {
    
        if (System.getProperty("java.vm.vendor").contains("Android")) {
    
            System.loadLibrary("dbr");
        } else {
    
            try {
    
                if (NativeLoader.load()) {
    
                    System.out.println("Successfully loaded Dynamsoft Barcode Reader.");
                }
            } catch (Exception e) {
    
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
     
    public NativeBarcodeReader() {
    
        nativePtr = nativeCreateInstance();
    }
     
    public void destroyInstance() {
    
        if (nativePtr != 0)
            nativeDestroyInstance(nativePtr);
    }
     
    public void setLicense(String license) {
    
        nativeInitLicense(nativePtr, license);
    }
     
    public void decodeFile(String fileName) {
    
        nativeDecodeFile(nativePtr, fileName);
    }
 
    private native int nativeInitLicense(long nativePtr, String license);
     
    private native long nativeCreateInstance();
     
    private native void nativeDestroyInstance(long nativePtr);
     
    private native void nativeDecodeFile(long nativePtr, String fileName);
}

Eclipse会自动编译.class文件到target目录中。使用javah命令生成头文件:

mkdir jni
cd jni
javah -cp ..\target\classes -o NativeBarcodeReader.h com.dynamsoft.barcode.NativeBarcodeReader

创建对应的C/C++文件NativeBarcodeReader.cxx:

#include "NativeBarcodeReader.h"
#include "DynamsoftBarcodeReader.h"
 
#ifdef __cplusplus
extern "C"
{
   
#endif
 
    /*
    * Class:     com_dynamsoft_barcode_NativeBarcodeReader
    * Method:    nativeInitLicense
    * Signature: (JLjava/lang/String;)I
    */
    JNIEXPORT jint JNICALL Java_com_dynamsoft_barcode_NativeBarcodeReader_nativeInitLicense(JNIEnv *env, jobject, jlong hBarcode, jstring license)
    {
   
        const char *pszLicense = env->GetStringUTFChars(license, NULL);
 
        if (hBarcode)
        {
   
            DBR_InitLicense((void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值