gpt4 book ai didi

java - JNI GetByteArrayElements () 错误

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:03 26 4
gpt4 key购买 nike

我是 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 代码:

#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.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'和其他一些格式长度不等于字节长度的原因。并提供解决该问题的方法。

最佳答案

    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);

关于java - JNI GetByteArrayElements () 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com