我是 JNI 的新手,所以我对 JNI 和英语都不熟悉。
我的JNI项目是一个简单的文件读写。在 Java 中读取文件并将字节数组传递给 C API,然后使用 C 将其写入文件。
我的源代码:
Java代码是:
public class FileIO {
static {
System.loadLibrary("FileIO");
}
private native void writeFile(byte[] msg);
public static void main(String[] args) throws IOException {
byte[] array = Files.readAllBytes(new File("PtFBWCTn.mp3").toPath());
// System.out.println(array.length);
new FileIO(). writeFile(array);
}
}
C code :
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "HelloJNI.h"
JNIEXPORT void JNICALL Java_FileIO_ writeFile (JNIEnv *env, jobject job, jbyteArray array ){
jsize num_bytes = (*env)->GetArrayLength(env, array);
printf("Byte length : %d\n" , num_bytes);
unsigned char * buffer;
jbyte *lib ;
lib =(jbyte *) malloc( ( num_bytes +1 ) * sizeof(jbyte));
(*env)->GetByteArrayRegion(env , array, 0 , num_bytes , lib);
// lib = (*env)->GetByteArrayElements(env , array, 0);
buffer =(char *) lib ;
FILE *fp;
fp=fopen("test.mp3", "wb");
printf("size : %d , length : %d ,contant : %s\n" ,(int)sizeof(buffer), (int)strlen(buffer) , buffer );
fwrite(buffer, sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
return;
}
我路过时遇到问题(.zip
, .mp3
, .mp4
, .jpg
and .png
) 文件字节数组。我尝试一些文本文件格式,例如.txt
, .java
, .c
文件创建的是我所期望的。
是什么原因?
我尝试过(用Java读取我的java文件(FileIO.java),输出是):
Byte length : 238653
size : 8 , length : 4 ,contant : import java.nio.file.Files;
import java.io.File;
public class FileIO {
static {
System.loadLibrary("FileIO");
}
private native void writeFile(byte[] msg);
public static void main(String[] args) throws IOException {
byte[] array = Files.readAllBytes(new File("PtFBWCTn.mp3").toPath());
// System.out.println(array.length);
new FileIO(). writeFile(array);
}
}
我尝试了(一些 test.png ,输出是):
Byte length : 381729
size : 8 , length : 8 ,contant : ?PNG
GetByteArrayElements() 在读取媒体和其他某些格式时仅返回 8 个字节。但对于文本文件,它返回正确的字节数。
请提供“png”和其他某些格式长度不等于字节长度的原因。并提供如何解决这个问题的方法。