Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JNI在C缓冲区中写入OutputStream_Java_Android_C_Java Native Interface - Fatal编程技术网

Java 使用JNI在C缓冲区中写入OutputStream

Java 使用JNI在C缓冲区中写入OutputStream,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我试图在我的C程序中处理DNG文件(从DngCreator获得)。 我不想用Java将其保存到磁盘,然后从C加载,因为这会浪费时间并消耗闪存(我每个会话需要大约40个DNG,因此超过800 MB)。 我对Java不是很熟悉,但有没有办法覆盖OutputStream并添加我自己的JNI调用?假设您有一个可以处理OutputStream的DNG创建函数,您可以实例化ByteArrayOutputStream,将其作为参数传递给DNG创建函数,然后通过方法调用toByteArray()获取字节数组 然

我试图在我的C程序中处理DNG文件(从DngCreator获得)。 我不想用Java将其保存到磁盘,然后从C加载,因为这会浪费时间并消耗闪存(我每个会话需要大约40个DNG,因此超过800 MB)。
我对Java不是很熟悉,但有没有办法覆盖OutputStream并添加我自己的JNI调用?

假设您有一个可以处理OutputStream的DNG创建函数,您可以实例化ByteArrayOutputStream,将其作为参数传递给DNG创建函数,然后通过方法调用
toByteArray()
获取字节数组

然后可以将其传递到本机C库

在代码中,这可能如下所示:

package com.software7.jni;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {
    private native void transferDng(byte[] data);

    private void someDNGCreationFunction(OutputStream outputStream)
            throws IOException {
        outputStream.write("hello world!".getBytes(UTF_8));
    }

    private void test() throws IOException {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            someDNGCreationFunction(baos);
            transferDng(baos.toByteArray());
        }
    }

    public static void main(String[] args) {
        System.loadLibrary("Native");
        Main m = new Main();
        try {
            m.test();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
然后,本机端可以从字节数组中检索数据,例如,查看此精细答案

#包括
#包括
#包括
#包括“com_software7_jni_Main.h”
JNIEXPORT void JNICALL Java_com_软件7_jni_Main_transferDng
(JNIEnv*env、jobject obj、jbyteArray dng){
jsizenum_bytes=(*env)->GetArrayLength(env,dng);
jbyte*b=(*env)->getbytearrayellements(env,dng,0);
char*buffer=malloc(num_字节);
memcpy(缓冲区,b,num_字节);
(*env)->按技术要求发布(env、dng、b、0);
//对缓冲区做些什么,这里的printf仅用于测试
printf(“%s”,num_字节,缓冲区);
自由(缓冲);
返回;
}
#include <string.h>
#include <stdlib.h>
#include <jni.h>
#include "com_software7_jni_Main.h"


JNIEXPORT void JNICALL Java_com_software7_jni_Main_transferDng
  (JNIEnv *env, jobject obj, jbyteArray dng) {
    jsize num_bytes = (*env)->GetArrayLength(env, dng);
    jbyte *b = (*env)->GetByteArrayElements(env, dng, 0);
    char *buffer = malloc(num_bytes);
    memcpy(buffer, b, num_bytes);
    (*env)->ReleaseByteArrayElements(env, dng, b, 0);
    //do something with the buffer, here a printf only for testing 
    printf("%.*s", num_bytes, buffer);
    free(buffer);
    return;
}