由於現在大多電腦都是多核CPU,多線程往往會比單線程更快,更能夠提高併發,但提高併發並不意味著啟動更多的線程來執行。更多的線程意味著線程創建銷毀開銷加大、上下文非常頻繁,你的程式反而不能支持更高的TPS。 時間片 多任務系統往往需要同時執行多道作業。作業數往往大於機器的CPU數,然而一顆CPU同時 ...
最近項目需要,將C++的演算法工程編譯成動態鏈接庫,交給 Java後臺當作函數庫調用。就去瞭解了下Jni。使用起來還是比較方便的。
1. 首先編寫Java的調用類。例如:
public class TestJni(){
static{
System.loadLibrary("TestJinDll"); //這個名字隨便起,跟C++生成的DLL對應就行
}
public static native String callFun(String paramStr); //具體的調用方法。
}
2. 導出這個類的.h文件,也就是頭文件。可以用命令行生成也可以通過IDEA編輯個工具,這樣以後修改直接生成就可以了。就是這樣:
使用的時候就 文件上右鍵--> external tools-->javah.就可以了。這時就生成了一個頭文件。類似於這樣⬇️:
這裡邊的東西不要改。
3. 建立一個C++工程。選動態鏈接庫類型的。將這個頭文件複製過去 。同時還有 兩個頭文件分別是jni.h和jni_md.h,這兩個文件在jdk安裝目錄下include文件下和include/win32下,全部 複製到C++工程。然後就是實現了,將頭文件中的方法聲明原封不動的copy到源文件 中去實現就可以了。然後就可以生成動態 鏈接庫了 。
參數的類型jstring,只是Java到C++的中間類型。其他的類型也都可以。我這裡傳個json串過去,在C++中解析成類就好了 。
json串的解析可以使用 rapidjson。 github大神封裝的AIGCJson很好用,傳送門。
4. 生成的鏈接庫複製到Java工程的根目錄下。調用就好了。 String res = TestJni.callFun(param);