Mut*_* GM 6 c java java-native-interface c-strings
我是 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);
}
}
Run Code Online (Sandbox Code Playgroud)
C代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我在传递 ( .zip、.mp3、.mp4和.jpg).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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了(一些 test.png ,输出是):
Byte length : 381729
size : 8 , length : 8 ,contant : ?PNG
Run Code Online (Sandbox Code Playgroud)
GetByteArrayElements() 在读取媒体和其他某种格式时仅返回 8 个字节。但对于文本文件,它返回正确的字节数。请提供“png”和其他某些格式长度不等于字节长度的原因。并提供如何解决这个问题的方法。
jsize num_bytes = (*env)->GetArrayLength(env, array);
char * buffer;
buffer = (char *) malloc (num_bytes);
jbyte *lib = (*env)->GetByteArrayElements(env , array, 0);
memcpy ( buffer , lib , num_bytes ) ;
FILE *fp;
fp=fopen("test.png", "wb");
fwrite(buffer, sizeof(char) , num_bytes , fp);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8412 次 |
| 最近记录: |