Как переместить данные из java InputStream в char * в c ++ с помощью jni? - PullRequest
0 голосов
/ 16 июня 2011

Как я могу переместить данные, хранящиеся в java InputStream, в char * в c ++, используя JNI?

Спасибо, Карлос.

Ответы [ 3 ]

4 голосов
/ 21 ноября 2012

Это java-код

InputStream is = new FileInputStream("filename");

int numBytesToRead = 1024;
byte[] inBuffer = new byte[numBytesToRead];
int bytesRead = is.read(inBuffer, 0, numBytesToRead);

decodeAacBytes(inBuffer, bytesRead);

, а jni-код:

jint Java_com_example_test_MainActivity_decodeAacBytes(JNIEnv * env, jobject this, jbyteArray input, jint numBytes)
{
    //copy bytes from java
    jbyte* bufferPtr = (*env)->GetByteArrayElements(env, input, NULL);
    char *inputBytes = malloc(numBytes * sizeof(char));
    memcpy(inputBytes, bufferPtr, numBytes);
    (*env)->ReleaseByteArrayElements(env, input, bufferPtr, 0);

    return 0;
}

Значения теперь будут в массиве inputBytes

0 голосов
/ 16 июня 2011

Из Java:

{
        InputStream inputStream = rcvStream;

        byte[]  inData      = new byte[1024];
        int     bytesRead   = inputStream.read();
        byte[]  actualData  = new byte[bytesRead];
        System.arraycopy(inData, 0, actualData, 0, bytesRead);

        jni.setByteArray(inData, bytesRead);
}

Из C:

{

JNIEXPORT jbyteArray JNICALL Java_org_alok_jni_AlokJNI_setByteArray
  (JNIEnv * env, jclass this1, jbyteArray ba, jint len) {
memcpy(my_char_array, ba, len);

}
0 голосов
/ 16 июня 2011

Я не знаю, можете ли вы передать объект типа InputStream в JNI, но вы можете передать строку.

Хитрость заключается в получении char [] в Java перед выполнением вызова JNI.Вы можете скопировать содержимое InputStream в ByteArrayOutputStream, получить byte [] из ByteArrayOutputStream и создать String из байта [].

...