java使用JNI调用C接口

1.java文件 JavaCallC.java

package callC;

public class JavaCallC {
	static {
//		System.out.println(System.getProperty("java.library.path"));
		System.loadLibrary("JavaCallC");  //此字符串为最后生成的javaCallC.dll的名称,javaCallC.dll要放在jre的bin目录下
	}
	
	public native int StrInIntOut(String str); //将要在C中实现的
	
	public static void main(String[] args) {
		JavaCallC javaCallC=new JavaCallC();
		int a=javaCallC.StrInIntOut("123");
		System.out.println(a);
//		System.out.println("123");
	}
}

然后编译成class文件:

D:\workplace\eclipse\functioncall\src>javac  callC/JavaCallC.java

生成头文件:

D:\workplace\eclipse\functioncall\src>javah -classpath D:\workplace\eclipse\functioncall\src  -d d:/ -jni callC.JavaCallC

其中java中各个命令的意思是

-classpath <路径> 用于装入类的路径
-d <目录> 输出目录
-jni 生成 JNI样式的头文件(默认)

注意到以上我们命令中指定的路径

注意到我们的命令符的执行位置是源代码目录”D:\workplace\eclipse\functioncall-new2\src

-classpath  后面的路径是指包”callC”所在的根路径  -jni 后面的路径是包名+类名     

在此目录下会生成javaCallC.h的头文件,此为C的头文件,代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class callC_JavaCallC */

#ifndef _Included_callC_JavaCallC
#define _Included_callC_JavaCallC
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     callC_JavaCallC
 * Method:    StrInIntOut
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_callC_JavaCallC_StrInIntOut
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

然后在VS中建立project步骤如下:(主要配置项目属性,添加jdk的目录,要不jni报错找不到)

参考https://blog.csdn.net/tustyao/article/details/47049461

// JavaCallC.cpp : 定义 DLL 应用程序的导出函数。

#include "stdafx.h"
#include  
#include "javaCallC.h" //引入头文件,刚刚javah生成的
#include 

/*字符串转数字*/
JNIEXPORT jint JNICALL Java_callC_JavaCallC_StrInIntOut(JNIEnv *env, jobject arg, jstring inString) {

	printf("Hello,%s\n", inString);
	
	return 123;

}

release下生成解决方案,即可生成dll文件,复制到jre/bin目录下,运行java程序即可。

你可能感兴趣的:(java)