JNI byteArray an Java Konstruktor übergeben

perichte

Grünschnabel
Hallo,

habe folgendes Problem:

In meinem JAVA Objekt, dass ich der nativen C Methode als "jobject Key" übergebe, sind einige unitialisierte Attribute vorhanden. Unter anderem ein JAVA ByteArray Attribut mit dem Namen "keyrecord".

Die ID des Feldes zu bekommen ist erstmal kein Problem:
Code:
jclass PublicKey=(*env)->GetObjectClass(env, Key);

jfieldID pubKeyrecordID=(*env)->GetFieldID(env, PublicKey, "keyrecord","[B");

Jetzt möchste ich allerdings erreichen, dass ich aus einem C Objekt ein unsigned char Attribut als jbyteArray abspeichere und dem JAVA Konstruktor dem entsprechendem Feld übergebe.

Also folgendermaßen ist das C Objekt definiert.

Code:
typedef struct _ICA_KEY_RSA_MODEXPO
{   unsigned int  keyType;             /* RSA key type.               */
    unsigned int  keyLength;           /* Total length of the token.  */
    unsigned int  modulusBitLength;    /* Modulus n bit length.       */
                                       /* -- Start of the data length.*/
    unsigned int  nLength;             /* Modulus n = p * q           */
    unsigned int  expLength;           /* exponent (public or private)*/
                                       /*   e = 1/d * mod(p-1)(q-1)   */
                                       /* -- Start of the data offsets*/
    unsigned int  nOffset;             /* Modulus n .                 */
    unsigned int  expOffset;           /* exponent (public or private)*/
    unsigned char reserved[112];       /* reserved area               */
                                       /* -- Start of the variable -- */
                                       /* -- length token data.    -- */
    ICA_KEY_RSA_MODEXPO_REC keyRecord;
} ICA_KEY_RSA_MODEXPO;

wobei

Code:
typedef unsigned char ICA_KEY_RSA_MODEXPO_REC[MAX_MODEXP_SIZE];

Ich will nun das unsigned char-Array keyRecord unter pubKeyrecordID abspeichern. Folgendes habe ich probiert und funktioniert leider nicht.

Code:
ICA_KEY_RSA_MODEXPO wockey;

jbyteArray byteArray = (*env)->GetObjectField(env, xxxobject, pubKeyrecordID);
(*env)->SetObjectField(env, xxxobject, pubKeyrecordID, wockey.keyRecord);

Für Datentyp "int" ist die Übergabe über "SetIntField" problemlos. Kann mir jemand weiterhelfen und sagen, wie ich das char array "keyRecord" als JAVA Byte Array im Konstruktor unter byte [] keyrecord abspeichere?
 
Bin jetzt selber darauf gekommen wie ich das char Array in ein Java ByteArray umwandle, also bevor sich jetzt jemand den Kopf zerbricht, hier ist der entsprechende Code:

Code:
unsigned char *keyRecord;
jbyte *tmp;
int length=sizeof(wockey);

keyRecord=wockey.keyRecord;
byteArray = (*env)->NewByteArray(env, length);

//stelle dynmaisch Speicherplatzzur Verfügung
tmp = malloc(length * sizeof(jbyte));
 for(i=0;i<length; ++i){
   tmp[i] = (jbyte) keyRecord[i];
  (*env)->SetByteArrayRegion(env, byteArray, 0,length, tmp);
 }
//Schreibe byteArray beim JAVA Konstruktor ins entsprechende Feld
 (*env)->SetObjectField(env, PublicKeyObject, pubKeyrecordID, byteArray);
 
Zurück