JNI 文件读写

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sumsear/article/details/77430264

对于只要入门了的Java工程师,写一个文件读写的功能是相当的简单,但是通过JNI进行文件的读写,相信有很多人都没去做过。当然对于JNI入门了的开发人员来说,这只是小菜一碟而已。

今天我也来试试JNI如何实现文件读写:

首先在java类中写一个native 方法: 

public native  void readAndWriteFile(String srcPath, String targetPath);

然后在CMD中 将路径切换到当前java工程src目录下并执行javah命令生成头文件,如果有生成好的头文件,可以自己手写就可以了:

例如 :     E:\myproject\JNIDemo\src>javah -classpath  E:\myproject\JNIDemo\bin   -d E:/ -jni com.demo.jni.Demo01  


生成头文件后将头文件、java JDK bin目录下的 jni.h 和jni_md.h拷贝到已经visual studio c++工程的目录下,导入已有项,将头文件中报错的部分处理掉,就可以开始写C代码了

JNIEXPORT void JNICALL Java_com_demo_jni_Demo01_readAndWriteFile(JNIEnv * env, jobject jobj, jstring src, jstring target){
	//因为c的fopen函数对应的路径参数必须是char类型的,所以卫门需要将jstring 转换为 char,因为在JNI中jChar == char所以调用
	//GetStringUTFChars函数即可。
	char * c_src = (*env)-> GetStringUTFChars(env, src, NULL);
	char * c_target = (*env) -> GetStringUTFChars(env, target, NULL);
	FILE * rf = fopen(c_src, "rb");
	FILE * wf = fopen(c_target, "wb");
	char buff [50];
	int len;
	while(len = fread(buff, sizeof(char), 50 , rf) !=0){
		fwrite(buff, sizeof(char) , len , wf)
	}
	fclose(wf);
	fclose(rf);
	(*env) -> ReleaseStringUTFChars(env, src, c_src); //通知JVM释放内存
	(*env) -> ReleaseStringUTFChars(env, target, c_target); //通知JVM释放内存
}
c写完后使用 visual studio 生成dll文件。

public class Demo01{

	public native void readAndWriteFile(String srcPath, String targetPath);
	static{
		system.load("E:/xxx/xxx/xxx.dll");
	}
	public static void main(String [] args){
	
	Demo01 demo = new Demo01();
	String srcPath = "E:/xxx/xxx/srcName.jpg";
	String targetPath = "E:/xxx/xxx/targetName.jpg"
	demo.readAndWriteFile(srcPath , targetPath);
	}	
}

运行java工程,文件读写成功!!!


猜你喜欢

转载自blog.csdn.net/sumsear/article/details/77430264
JNI