[jni] jbytearray <-> byte array

darkeye2

Bekanntes Mitglied
Hallo,

google mag mich mal wieder nicht (oder ich finde nicht den passenden suchbegriff), auf jeden fall versuche ich grad ein jbytearray in eine normales c(++) byte array umzuwandeln und zum schluss noch ein byte array in ein jbyte array, leider will keins von beiden klappen. Dank google hab ich jetzt mindestens 10 verschiedene methode, die keine wirklich funktioniert, könnte mir jemand bitte eine (möglichst einfache) funktionierende möglichkeit für beide umwandlungen posten?

Danke in vorraus.

MfG
darkeye
 

darkeye2

Bekanntes Mitglied
ich verwende die daten um sie an eine methode zu übergeben, die wiederrum ein byte array zurückgibt, dass ich wieder an mein java prog zurückgeben will, leider scheint irgendwas schief zu laufen, da mein prog immer abstürzt, so sieht dier betroffene code aus:

Java:
//nötige variablen
       BYTE *recieveData;
       BYTE *sendData; 
       DWORD len = 16;
       DWORD *sendedDataLength;
       DWORD *recieveDataLength;

//jbytearray in byte array umwandeln (scheint zu klappen, bin mir zwar nicht hundert prozentig sicher, aber fast)
       jbyte *dataArr = env->GetByteArrayElements(b, 0);  //b ist das übergebene jbytearray
       for(int i = 0; i<4; i++){
          sendData[i] = dataArr[i]; 
       }

//meine methode, die ihrerseits recieveData einen wert zuweist
MPRead(inPipe, recieveData, len, recieveDataLength, timeout)

//bis hierhin läuft das prog noch, doch in der folgenden schleife stürzt es sofort ab, ziel ist es, das byte array in ein jbytearray umzuwandeln
       jbyteArray result = env->NewByteArray(4);
       jbyte *bytes = env->GetByteArrayElements(result, 0);
       for(int k = 0; k<4;k++){
          bytes[k] = recieveData[k];
       }
       env->SetByteArrayRegion(result, 0, 4, bytes );
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm... ist schon spät, und ... ich gehe davon aus, dass dort irgendwo ein "new" oder "malloc" vorkommt, weil es sonst viel früher und überschaubarer abkacheln würde, aber... beim ersten drüberschauen sehe ich nirgendwo ein ReleaseByteArrayElements... kann's sein, dass du stattdessen(!?) SetByteArrayRegion verwendet hast?! Grob sowas wie
Java:
       //jbytearray in byte array umwandeln ...
       jbyte *dataArr = env->GetByteArrayElements(b, 0);  //b ist das übergebene jbytearray
       for(int i = 0; i<4; i++){
          sendData[i] = dataArr[i]; 
       }

       // Abort: Nichts zurüchschreiben, 'b' wurde nur gelesen und wird jetzt nicht mehr gebraucht
       env->ReleaseByteArraElements(b, dataArr, JNI_ABORT); 
 
...
       //bis hierhin läuft das prog noch, doch in der folgenden schleife stürzt es sofort ab...
       jbyteArray result = env->NewByteArray(4);
       jbyte *bytes = env->GetByteArrayElements(result, 0);
       for(int k = 0; k<4;k++){
          bytes[k] = recieveData[k];
       }
       // Das 0 als letzter parameter heißt: Schreib' die daten ggf. zurück 
       env->ReleaseByteArrayElements(result, bytes, 0);

Als Alternative kann man in diesem Fall auch GetPrimitiveArrayCritical in Erwägung ziehen.


EDIT: Nebenbei: Eigentlich müßte man nach etlichen dieser Methoden (nämlich bei allen, zu denen unter JNI Functions irgendwas mit "Throws" steht) ein
if (env->ExceptionCheck()) { ... so schnell wie möglich zurück zu Java ... }
machen... Ja, wird schnell unübersichtlich... :(
 
Zuletzt bearbeitet:

darkeye2

Bekanntes Mitglied
hi, schonmal danke für deine hilfe, aber es klappt immer noch nicht, ich hab ein c byte array, was auf folgende weise "entstanden" ist:

BYTE *recieveData = new BYTE[4];
//übergabe des pointers an eine methode, die das array befüllt.

dannach kann ich mir die 4 elemente ausgeben lassen, also das array ist definitief voll und hat 4 elemente, nun will es es als jbytearray zurückgeben, aber kriege nur eine NullPointerException.

Java:
jbyteArray result = env->NewByteArray(4);
       jbyte *bytes = env->GetByteArrayElements(result, 0);
       printf("array bytes: %u", sizeof(recieveData));
       for(int k = 0; k<4;k++){
          printf("  byte: %d", recieveData[k]);
          printf("\r\n");
          bytes[k] = recieveData[k];
       }
       env->ReleaseByteArrayElements(result, bytes, 0);
 

Marco13

Top Contributor
Hm... an dem Code sieht erstmal nichts falsch aus... wo kachelt er da denn ab? Ggf. kann ich morgen oder übermorgen mal schauen, ob ein "KSKB" da hilft...
 

darkeye2

Bekanntes Mitglied
also ich weiß wirlich nicht, wieso ich einen fotal error kriege, mein code sieht so aus:

Java:
JNIEXPORT jbyteArray JNICALL Java_de_ls_usb_mc_kernel_MpUsbApi_writeCMD
  (JNIEnv *env, jobject obj, jbyteArray b){
       outPipe = MPUSBOpen(0, pid_vid, out_pipe, MP_WRITE, 0);   
       inPipe = MPUSBOpen(0, pid_vid, in_pipe, MP_READ, 0);  
  
       BYTE *recieveData  = new BYTE[4]; 
       BYTE *sendData;
       DWORD len = 64;
       DWORD sendedDataLength;
       DWORD recieveDataLength;
       
       //sendData[0] = 0;
       //sendData[1] = 0;
       //sendData[2] = 0;
       //sendData[3] = 0;
       
       jbyte *dataArr = env->GetByteArrayElements(b, 0);
       for(int i = 0; i<4; i++){
          sendData[i] = dataArr[i];
       }
       env->ReleaseByteArrayElements(b, dataArr, JNI_ABORT);
       
       SendReceivePacket(sendData, 4, recieveData, &RC_LENGTH, timeout, timeout+timeout);
       
       MPUSBClose(outPipe);
       MPUSBClose(inPipe);   
        
       jbyteArray result = env->NewByteArray(4);
       jbyte *bytes = env->GetByteArrayElements(result, 0);
       printf("\r\n");
       for(int k = 0; k<4;k++){
          printf("Recieved Byte %d",k);
          printf(" : %d", recieveData[k]);
          printf("\r\n");
          bytes[k] = recieveData[k];
       }
       
       //env->SetByteArrayRegion(result, 0, 4, bytes );
       env->ReleaseByteArrayElements(result, bytes, 0);
         
      //return result;         
  }

wie ich der ausgabe auf der console entnehmen kann sind die werte, die das c byte array enthalten richtig, und ich weiß nicht, an welcher stelle da jetzt ein fehler auftritt, ich kriege einfach jedes mal einen fotal error und das ganze stürtzt (logischer weise) ab
 

darkeye2

Bekanntes Mitglied
ok, also es liegt wohl nicht mal am java code, was für gründe kann es geben, dass sich die vm verabschieded?
der c code wird problemlos ausgeführt, es gibt zwar einen fehler (GetLastError()), aber dieser ist bei der funktion, die aufgerufen wird normal, und tritt fast immer auf, was nicht weiter schlimm ist, das ergebniss stimmt immer, nur mag die vm irgendwie nicht,
jemand eine idee?
 

Marco13

Top Contributor
Da sieht jeztz wiederum komisch aus, dass das "return" fehlt, aber insbesondere, dass "sendData" NULL (bzw. unitialisiert) ist... wenn's nicht klappt, compilier' ich das morgen vielleicht mal.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
U short[] nach byte[] Java Basics - Anfänger-Themen 11
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
H 1 Byte Status Variable Java Basics - Anfänger-Themen 3
P Datentypen Byte und char Typecast Java Basics - Anfänger-Themen 2
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
W Datentypen int -> byte Java Basics - Anfänger-Themen 2
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
F Typenumwandlung byte <=> int verstehen Java Basics - Anfänger-Themen 3
S Byte eines arrays Java Basics - Anfänger-Themen 17
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14
B unsigned byte Problem Java Basics - Anfänger-Themen 9
S 2 Byte Arrays addieren Java Basics - Anfänger-Themen 45
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
Z Wie Byte[] in einen String oder int konvertieren Java Basics - Anfänger-Themen 2
0 byte[] -> hex Java Basics - Anfänger-Themen 2
G char[] in byte[] konvertieren? Java Basics - Anfänger-Themen 2
V Byte Arrays in Strings umwandeln und splitten Java Basics - Anfänger-Themen 2
M unsigned byte Java Basics - Anfänger-Themen 4
F Byte 0 und 1 einzelnd zuweisen? Java Basics - Anfänger-Themen 17
G byte [] aus uRL erhalten Java Basics - Anfänger-Themen 11
J Byte-Array als Hex-Datei speichern? Java Basics - Anfänger-Themen 9
G Hex to Byte Java Basics - Anfänger-Themen 13
S Byte in Zahl umwandeln Java Basics - Anfänger-Themen 3
M Double-Wert in Byte[] umwandeln Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben