C++/Java调用C++动态链接库————附带示例和详细讲解-创新互联

文章目录
  • 0 准备
  • 1 C++调用动态链接库
  • 2 Java调用C++动态链接库
  • 3 运行

成都创新互联专业为企业提供云冈网站建设、云冈做网站、云冈网站设计、云冈网站制作等企业网站建设、网页设计与制作、云冈企业网站模板建站服务,十载云冈做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。0 准备

在CMake中,使用如下的方法把代码编译成动态/静态链接库:

# 设置项目名 
project(getMatInfo)

# 设置c++版本
set(CMAKE_CXX_STANDARD 11)

 # 如果不填写SHARE,默认为静态链接库,或者把SHARED替换为STATIC
 add_library(getMatInfo SHARED
        getMatInfo.h
         getMatInfo.cpp)

各个平台的动态或静态链接库的格式,mac环境下的都是.dylib,在linux上为.so/.a文件,在windows上为.dll/.lib
在这里插入图片描述

注意在编译之前,需要在头文件中声明后面动态链接库函数中需要被调用的函数。例如,如下就是getMatInfo.h头文件中的内容:

#ifndef GETMATINFO_GETMATINFO_H
#define GETMATINFO_GETMATINFO_H


extern "C"{void getMatInfo(const char* path, const char* variableName,int& row, int& col);
};

#endif //GETMATINFO_GETMATINFO_H
1 C++调用动态链接库

调用方法如下:

  • 1,把头文件getMatInfo.h放在和调用函数的同级目录下;
  • 2,在CMakeLists.txt中添加动态链接库的路径LINK_LIBRARIES("/Users/mac/CLionProjects/testlib/libgetMatInfo.dylib")【根据自己的情况做具体修改】;
  • 3,像正常调用方法一样调用动态链接库中的方法,例如下面的代码;
#include#include "getMatInfo.h"

int main() {const char *path = "/Users/mac/CLionProjects/getMatInfo/ranking.mat";
    const char* variableName = "Data"; //FigData
    int n = 0;
    int m = 0;
    getMatInfo(path, variableName, n, m);
    std::cout<< n<< " "<< m;
    }
2 Java调用C++动态链接库

常见Java调用C++的代码方法有jni、jna、JNative。jni需要先编写Java代码,然后转换成C++代码,被调用的C++代码再去实现Java转转后的C++方法。虽然效率最高,但是比较麻烦。

这里使用是jna调用C++中的方法,原因就是不用改写C++的代码,相对简单一些。不过这个需要被调用的C++方法,改写对应的的数据结构,以便Java调用。
常见的数据结构映射如下:

请添加图片描述
指针对应的映射:
在这里插入图片描述
这里使用的库为:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

在这里插入图片描述
在IDEA中导入库的方法如下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

首先,继承Library,然后定义载入动态链接库的变量,声明调用的接口:

package com.jk.jnaTest;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface JnaDll extends Library {JnaDll jnadll = (JnaDll) Native.load("/Users/mac/Downloads/springCloud/testLib/src/com/jk/jnaTest/libgetMatInfo.dylib", JnaDll.class);
        
    void getMatInfo(String path, String varName,IntByReference row, IntByReference col);

}

调用动态链接库的方法:

package com.jk.jnaTest;

public class JnaTest {public static void main(String[] args){IntByReference row = new IntByReference();
        IntByReference col = new IntByReference();

        String matPath = "/Users/mac/Downloads/springCloud/testLib/src/com/jk/jnaTest/Fig.mat";
        String varName = "FigData";
        JnaDll.jnadll.getMatInfo(matPath, varName,row, col);
        
        System.out.println(row.getValue());//纬度
        System.out.println(col.getValue());//个数

        System.out.println("testJna");
    }
}
3 运行

如果是在Linux下,不实用开发集成环境,直接使用JDK自带的指令进行编译和运行。

编译(两个jna的包的路径需要存在):

javac -cp .:/code/testLib/src/com/jk/jnaTest/jna-5.11.0.jar:/code/testLib/src/com/jk/jnaTest/jna-platform-5.11.0.jar -d . /code/testLib/src/com/jk/jnaTest/*.java

运行(进入到/code/testLib/src/com/jk/jnaTest/路径中):

java -cp .:/code/testLib/src/com/jk/jnaTest/jna-5.11.0.jar:/code/testLib/src/com/jk/jnaTest/jna-platform-5.11.0.jar com.jk.jnaTest.JnaTest

如果是使用编译器,那么需要打包成jar包,然后放到Linux服务器上进行执行:

在这里插入图片描述

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:C++/Java调用C++动态链接库————附带示例和详细讲解-创新互联
URL标题:http://ybzwz.com/article/dedcod.html