java动态调用c++库
前言
最近在做一個通過java程序調用c++動態語言庫,在網上百度,谷歌找了諸多例子,還是屢試不爽。經過一番折騰還是披荊斬棘,創出一條道路。希望分享給正在迷茫的朋友們...
使用的環境
spring boot + gradle
JNI介紹
JNI全拼是Java Native Interface,中文意思為Java本地調用。JNI標準是Java平臺的一部分,它允許java和其他語言的代碼進行交互。JNI開始是為了本地已經編譯好的語言,尤其是C和C++而設計的,我們也可以使用JNI和其他語言進行溝通,我們只要調用約定受支持了就可以了。
JNI vs JNA
加載流程
使用jni和jna的區別這里便不再多說。這里我使用的是jna的方式。不多說,直接擼代碼,首先在依賴文件中加入相關jar包。
compile group: 'com.sun.jna', name: 'jna', version: '3.0.9'
windows環境
-
定義好java需要調用的本地方法,即native
EastmzGame.class
/*** get game result from third* @return*/public native String getGameResult(); 復制代碼 -
生成.class編譯文件
在類文件的當前目錄執行,這里加入了字符,防止亂碼。
javac -encoding utf-8 EastmzGame.java
-
生成.h頭文件
在src.main.java目錄下執行 javah -classpath . -jni com.bsmao.task.jni.EastmzGame
-
再由vc編譯工具將.h文件實現并且編譯出.dll文件,linux為.so文件。
將.dll文件放入到項目中或者放到e盤中
我這里是放到了resources下面
- java中再調用.dll文件
-
測試調用結果
這是經過處理過的數據
linux環境
定義本地方法:
本文是指定路勁讀取so文件(和so文件生成的文件路徑保持一致)
編譯.class 生成.h,.c文件
將上面兩個文件傳入到linux指定文件夾下
/usr/local/bsmao/lib
編譯出so文件 命令: sudo cc -I /usr/local/bsmao/java/jdk1.8.0_162/include/linux -I /usr/local/bsmao/java/jdk1.8.0_162/include/ -I /usr/local/bsmao/lib/ -fPIC -shared -o libEastmzGame.so com_bsmao_task_jni_EastmzGame.c 復制代碼生成出so文件
調用方式和windows一樣
EastmzGame eastmzGame = new EastmzGame();byte[] res = eastmzGame.ElevenAgreement(); 復制代碼測試結果
如果覺得有幫助,請打賞...(^_^ *** ^_^)
總結
以上是生活随笔為你收集整理的java动态调用c++库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mysql odbc驱动安装
- 下一篇: s3c2440移植MQTT