2016-06-16 8 views
0

Ok Ich weiß, dass diese Frage schon einmal gestellt wurde, aber ich denke, die Antwort ist in diesem Zusammenhang anders. Also im Grunde habe ich eine C-Bibliothek, die Funktionen Dichtung und entsiegeln enthält, die wie folgt aussehen:Wie durch Verweis in JNI übergeben?

JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1seal_1data 
(JNIEnv *env, jobject obj, jlong handle, jbyteArray data, jint size) 
{ 
    const char *cData = (*env)->GetByteArrayElements(env, data NULL); 
    jint token = securesdk_seal_data(handle, cData, size); 
    (*env)->ReleaseByteArrayElements(env, data, cData, JNI_ABORT); 
    return token; 
} 

JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1unseal_1data 
(JNIEnv *env, jobject obj, jlong handle, jint token, jbyteArray data, jint size) 
{ 
    const char *buffer = (*env)->GetByteArrayElements(env, data NULL); 
    jsize length = (*env)->GetArrayLength(env,data); 
    jlong address = securesdk_unseal_data(handle, token, buffer, size); 
    for(int i=0; i<length; i++){ 
     printf("%i\n", buffer[i]) 
    } 
    (*env)->ReleaseByteArrayElements(env, data, buffer, JNI_ABORT); 
    return address; 
} 

Grundsätzlich ist die Dichtungsfunktion auf der Java-Seite in einem Byte-Array nimmt und speichert sie im Flash-Speicher (keine Sorge wie das funktioniert) und gibt ein Token zurück. Die Unseal-Funktion nimmt einen leeren Byte-Array-Puffer und das Token auf und füllt den leeren Puffer mit den Daten. Jetzt ist hier der Java-Code und was es ausgibt.

class JavaTest{ 
    public native int securesdk_seal_data(long handle, byte[] data, int size); 
    public native int securesdk_unseal_data(long handle, int token, byte[] data, int size); 

    JavaTest test = new JavaTest(); 
    String data = "hello"; 
    byte[] cmdbuf = data.getBytes(); 
    int token = test.securesdk_seal_data(sdk, cmdbuf, cmdbuf.length); 
    byte[] emptybuf = new byte[10]; 
    long returnData = test.securesdk_unseal_data(sdk, token, emptybuf, emptybuf.lenth); 

    for(int i=0; i<emptybuf.length; i++){ 
     System.out.print(emptybuf[i]); 
    } 
} 

Also, wenn ich den Java-Code ausführen, druckt er die Bytes von "Hallo" aus der printf-Anweisung in dem C-Code aus. Wenn ich den leeren Puffer übergebe, wird er mit den Daten gefüllt, die ich ursprünglich versiegelt habe. Das ist richtig. ABER wenn ich versuche, den gefüllten Puffer nach dem Aufrufen der Unseal-Funktion in Java zu drucken, gibt es mir immer noch den leeren Puffer zurück. Wie kann ich den Puffer aus dem Speicher nach dem Aufrufen der C-Funktion aktualisieren? Ist das möglich? Ich möchte, dass es die Bytes von "Hallo" ausdruckt, wenn ich emptybuf aus Java und nicht nur aus C drucke. Danke.

Antwort

0

In entsiegeln statt JNI_ABORT passieren 0:

(*env)->ReleaseByteArrayElements(env, data, buffer, 0);