java调用C++ DLL库方法
轉載地址:?https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html?
? ? ? ?最近一個項目要開發網頁端人臉識別項目,人臉識別的算法已經寫好,是C++版,但是網頁端要求使用Java后臺,這就涉及到Java調用DLL的問題。經過查找,實現了一個簡單的例子。
1.第一步,先在Java中新建一個類
package com.test.jni; public class Java2cpp {static {System.loadlibrary("javaCllcpp");}public native int DLL_ADD(int a, int b); //加法public native int DLL_SUB(int a, int b); //減法public native int DLL_MUL(int a, int b); //乘法public native int DLL_DIV(int a, int b); //除法public static void main(String args[]) {int sum = 0, ans1 = 0, ans2 = 0, ans3 = 0;Java2cpp test = new Java2cpp();sum = test.DLL_ADD(2, 4);ans1 = test.DLL_SUB(7, 2);ans2 = test.DLL_MUL(4, 5);ans3 = test.DLL_DIV(9, 3);System.out.println("Java call cpp dll result:"+sum+" "+ans1+" "+ans2+" "+ans3+"");} }? 如上圖,其中注意這句System.loadLibrary("javaCallcpp");,這就是加載dll文件的代碼了,然后我們需要dll中實現下面定義的加減乘除方法。
2、編譯文件,文件名為Java2cpp.java,首先編譯成class文件,如果用的是eclipse,這個文件已經自動生成了,在工程目錄下的bin文件夾下。用命令行編譯,打開cmd窗口,cd到.java文件所在目錄,執行命令javac Java2cpp.java,即生成Java2cpp.class
? 然后執行命令javah Java2cpp生成Java2cpp.h頭文件,但是這一步往往會失敗,另一種方法可以成功,進入eclipse項目的目錄,進入bin文件夾,執行命令javah -classpath . -jni包名.類名(com.test.jni.Java2cpp),然后生成了com_test_jni_Java2cpp.h
3、在VS中新建項目win32項目,命名為:TestJNI第二步選擇如下:
??
4.把第二步生成的頭文件拷進項目文件夾,然后導入。
5.實現頭文件中的方法:
? ?(1) 新建頭文件dllApi.h,代碼如下:
#include "com_test_jni_Java2cpp.h"int DLL_API_ADD(int a, int b); int DLL_API_SUB(int a, int b); int DLL_API_MUL(int a, int b); int DLL_API_DIV(int a, int b);? ?(2) 新建dllApi.cpp實現上述方法,代碼如下:
#include "stdafx.h" #include <iostream> #include "dllApi.h"int DLL_API_ADD(int a, int b) {return (a + b); }int DLL_API_SUB(int a, int b) {return (a - b); }int DLL_API_MUL(int a, int b) {return (a * b); }int DLL_API_DIV(int a, int b) {return (a / b); }? ? (3) 在TestJNI.cpp中添加代碼實現com_test_jni_Java2cpp.h方法,添加完之后代碼如下:
//TestJNI.cpp:定義DLL應用程序的導出函數#include "stdafx.h" #include "TestJNI.h" #include "com_test_jni_Java2cpp.h" #include "dllApi.h" //這是導出變量的一個示例 TESTJNI_API int nTestJNI=0;//這是導出函數的一個示例 TESTJNI_API int fnTestJNI(void) {return 42; }//這是已導出類的構造函數 CTestJNI::CTestJNI() {return; }JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b) {int var = 0;var = DLL_API_ADD(a, b);return var; }JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b) {int var = 0;var = DLL_API_SUB(a, b);return var; }JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b) {int var = 0;var = DLL_API_MUL(a, b);return var; }JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b) {int var = 0;var = DLL_API_DIV(a, b);return var; }? ? ?(4) 生成dll,在項目文件夾下的Debug文件夾內可以找到TestJNI.dll,但是因為我們在Java里要求dll名為JavaCallcpp,所以此時把項目重命名為JavaCallcpp,然后重新生成JavaCallcpp。【這一步生成會失敗,按照如下添加路徑】
? ??
6. 調用方法
把第五步生成的JavaCallcpp.dll拷進JRE安裝路徑下的bin文件夾內,運行java程序即可。結果如下:
?
總結
以上是生活随笔為你收集整理的java调用C++ DLL库方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JNI教程与技术手册
- 下一篇: 手游引擎Unity和Cocos各有什么优