对于只要入门了的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工程,文件读写成功!!!