- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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/
我的程序出现直接内存 OOM。 该程序在java中使用了ByteBuffer.allocateDirect(),C++端将数据写入该缓冲区。但是当我尝试将 ByteBuffer.allocateDir
我正在尝试使用 C++ 在 Java 中创建 native 方法。但是,我的 g++ 编译器一直告诉我我的 GetByteArrayElements 函数没有声明。我已经将 jni.h 和相应的头文件
我正在使用 JNI/NDK 将一些 C++ 库与 Android 应用绑定(bind)。其中一种 Java 方法使用字节数组,因此我需要在 JNI 绑定(bind)中调用 GetByteArrayEl
我是 JNI 的新手,所以我对 JNI 和英语都不熟悉。 我的JNI项目是一个简单的文件读写。在 Java 中读取文件并将字节数组传递给 C API,然后使用 C 将其写入文件。 我的源代码: Jav
为了避免将 byte[] 转换为 String 的开销,我将 byte[] 从 Java 传递到 native 调用。我使用 GetByteArrayElements 来访问 jbyte 指针并将其转
我正在研究一种更有效的方法,通过 JNI 访问 ByteArray 的内容,而无需使用丑陋的 GetByteArrayElements。我正在寻找一些知识渊博的 JNI 专家来解释我所看到的内容,并可
我有一个问题。我正在调用一个测试函数,该函数从 Java 导入函数获取多个字节,然后将该数据作为一个短数组返回。目前我遇到一个问题,即程序因间接引用而崩溃。我的代码是这样的: #define AR_L
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!