在CMake中,使用如下的方法把代碼編譯成動(dòng)態(tài)/靜態(tài)鏈接庫:
# 設(shè)置項(xiàng)目名
project(getMatInfo)
# 設(shè)置c++版本
set(CMAKE_CXX_STANDARD 11)
# 如果不填寫SHARE,默認(rèn)為靜態(tài)鏈接庫,或者把SHARED替換為STATIC
add_library(getMatInfo SHARED
getMatInfo.h
getMatInfo.cpp)
各個(gè)平臺(tái)的動(dòng)態(tài)或靜態(tài)鏈接庫的格式,mac環(huán)境下的都是.dylib
,在linux上為.so/.a
文件,在windows上為.dll/.lib
注意在編譯之前,需要在頭文件中聲明后面動(dòng)態(tài)鏈接庫函數(shù)中需要被調(diào)用的函數(shù)。例如,如下就是getMatInfo.h
頭文件中的內(nèi)容:
#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++調(diào)用動(dòng)態(tài)鏈接庫調(diào)用方法如下:
getMatInfo.h
放在和調(diào)用函數(shù)的同級(jí)目錄下;CMakeLists.txt
中添加動(dòng)態(tài)鏈接庫的路徑LINK_LIBRARIES("/Users/mac/CLionProjects/testlib/libgetMatInfo.dylib")
【根據(jù)自己的情況做具體修改】;#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調(diào)用C++動(dòng)態(tài)鏈接庫常見Java調(diào)用C++的代碼方法有jni、jna、JNative。jni需要先編寫Java代碼,然后轉(zhuǎn)換成C++代碼,被調(diào)用的C++代碼再去實(shí)現(xiàn)Java轉(zhuǎn)轉(zhuǎn)后的C++方法。雖然效率最高,但是比較麻煩。
這里使用是jna調(diào)用C++中的方法,原因就是不用改寫C++的代碼,相對(duì)簡(jiǎn)單一些。不過這個(gè)需要被調(diào)用的C++方法,改寫對(duì)應(yīng)的的數(shù)據(jù)結(jié)構(gòu),以便Java調(diào)用。
常見的數(shù)據(jù)結(jié)構(gòu)映射如下:
指針對(duì)應(yīng)的映射:
這里使用的庫為:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
在IDEA中導(dǎo)入庫的方法如下:
首先,繼承Library
,然后定義載入動(dòng)態(tài)鏈接庫的變量,聲明調(diào)用的接口:
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);
}
調(diào)用動(dòng)態(tài)鏈接庫的方法:
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());//個(gè)數(shù)
System.out.println("testJna");
}
}
3 運(yùn)行如果是在Linux下,不實(shí)用開發(fā)集成環(huán)境,直接使用JDK自帶的指令進(jìn)行編譯和運(yùn)行。
編譯(兩個(gè)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
運(yùn)行(進(jìn)入到/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服務(wù)器上進(jìn)行執(zhí)行:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧