मैं अपने सी प्रोग्राम में डीएनजी फाइलों (जो मुझे डीएनजीक्रिएटर से मिलता है) को संसाधित करने की कोशिश कर रहा हूं। मैं इसे जावा में डिस्क पर सहेजना और फिर इसे सी से लोड नहीं करना चाहता, क्योंकि यह समय बर्बाद करता है और फ्लैश मेमोरी पहनता है (मुझे प्रति सत्र लगभग 40 डीएनजी चाहिए, इसलिए यह 800 एमबी से अधिक है)। मैं जावा से बहुत परिचित नहीं हूं, लेकिन क्या आउटपुटस्ट्रीम को ओवरराइड करने और अपना खुद का जेएनआई कॉल जोड़ने का कोई तरीका है?

0
Radu 26 मार्च 2020, 22:26

1 उत्तर

सबसे बढ़िया उत्तर

मान लें कि आपके पास एक डीएनजी निर्माण फ़ंक्शन है जो आउटपुटस्ट्रीम के साथ काम कर सकता है, तो आप बाइटएरेऑटपुटस्ट्रीम को तुरंत चालू कर सकते हैं, इसे अपने डीएनजी निर्माण फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं, और बाद में बाइट सरणी को विधि कॉल toByteArray() के साथ प्राप्त कर सकते हैं।

इसके बाद इसे देशी सी लाइब्रेरी में पास किया जा सकता है।

कोड में यह इस तरह दिख सकता है:

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

मूल पक्ष तब बाइट सरणी से डेटा पुनर्प्राप्त कर सकता है, उदा। यह बढ़िया उत्तर देखें https://stackoverflow.com/a/38787614/2331445

#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;
}
1
Stephan Schlecht 26 मार्च 2020, 21:15