Eclipse 中Java项目使用JNI调用VS2010 C++创建的DLL完整步骤
最近项目需要使用Java调用C++编写的DLL,经过大半天摸索终于成功完成测试Demo,现写下来做个笔记也给有需要的朋友做个参考。
前提:安装好Eclipse和JDK
注意JDK要和Eclipse保持一致,Eclipse是32位的JDK也需要32位。
1.Eclips编写JNI接口
JNIDemo是工程
JNIDemo.java是接口类
TestCallDll.java 是测试调用类
com.jni.demo是包名
接口类代码
JNIDemo.java
package com.jni.demo;
public class JNIDemo {
//定义一个本地方法
public native void sayHello();
public native boolean InitCam(String strpath);
}
2.生成接口头文件com_jni_demo_JNIDemo.h
进入工程bin目录使用 javah com.jni.demo.JNIDemo 生成C接口头文件com_jni_demo_JNIDemo.h
3.在JDK安装目录下找到 jni.h和jni_md.h文件
3.1 jni.h
C:\Program Files (x86)\Java\jdk1.8.0_212\include\jni.h
3.2 jni_md.h
C:\Program Files (x86)\Java\jdk1.8.0_212\include\win32\jni.md.h
4.使用VS2010创建DLL动态库工程
把刚生成的三个头文件引入工程
1.com_jni_demo_JNIDemo.h
2.jni.h
3.Jni_md.h
注意:在com_jni_demo_JNIDemo.h文件中,需要把#include<jni.h>改为#include "jni.h"
5.编写C++测试代码
JNIDemo.cpp
JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}
JNIEXPORT jboolean JNICALL Java_com_jni_demo_JNIDemo_InitCam(JNIEnv *env, jobject job, jstring str)
{
cout<<"Hello InitCam"<<endl;
char* chardata = jstringToChar(env, str);
printf("%s\n", chardata);
//printf("%s\n", str);
return 0;
}
注意:如需要接收Java传入的字符串,需要使用以下代码进行转换。
char* jstringToChar(JNIEnv *env, jstring jstr) {
int length = (env)->GetStringLength(jstr);
const jchar* jcstr = (env)->GetStringChars(jstr, 0);
char* rtn = (char*) malloc(length * 2 + 1);
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR) jcstr, length, rtn,
(length * 2 + 1), NULL, NULL);
if (size <= 0)
return NULL;
(env)->ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}
6.把成生的JNIDemo.DLL文件复制到Eclipse工程的目录下。
7.在Eclipse 编写Java测试类调用DLL
测试类
TestCallDLL.java
package com.jni.demo;
public class TestCallDLL extends JNIDemo {
public static void main(String[] args){
System.out.print("Hello!!!");
//调用动态链接库
System.loadLibrary("JNIDemo");
TestCallDLL jniDemo = new TestCallDLL();
jniDemo.sayHello();
jniDemo.InitCam("abc");
}
}
运行后看到输出字串,表明Java测试调用DLL成功。