Как вернуть пользовательский класс с членами byte [] в jni? - PullRequest
1 голос
/ 27 мая 2019

[обновлено] Код ниже работает сейчас, спасибо всем

Я получил несколько массивов uint8_t в коде jni / C, я хочу заполнить пользовательский объект членами байтовых массивов этими массивами uint8_t, а затем вернуть пользовательский объект на сторону java, кто-нибудь мне поможет? спасибо

Я ищу в Интернете, но очень смущен , Я до сих пор не могу перенести данные с C на Java, кто-нибудь мне поможет? спасибо

package com.example.prj;

/* the result class */
public class ZGKeyPair {

    public byte[] publicKey;
    public byte[] privateKey;

    public byte[] getPublicKey() {
        return publicKey;
    }

    public void setPublicKey(byte[] publicKey) {
        this.publicKey = publicKey;
    }

    public byte[] getPrivateKey() {
        return privateKey;
    }

    public void setPrivateKey(byte[] privateKey) {
        this.privateKey = privateKey;
    }

    public ZGKeyPair(){
        publicKey  = new byte[64];
        privateKey = new byte[32];
    }    
}


/* the interface class*/
public class ECC {
    static {
        System.loadLibrary("ecc");
    }
    public native ZGKeyPair generateKeyPair();
}


extern "C" JNIEXPORT jobject JNICALL Java_com_example_prj_ECC_generateKeyPair(JNIEnv *env, jclass){

        uint8_t privateKey[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 
                                  6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
                                  1, 2};
        uint8_t publicKey[64] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                                 1, 2, 3, 4};
       jclass cls = env->FindClass("com/example/prj/ZGKeyPair");
        if(cls == 0 || cls == NULL){

            return NULL;
        }

        jmethodID constructorId = env->GetMethodID(cls, "<init>", "()V");
        if(constructorId == 0 || constructorId == NULL){

            return NULL;
        }

        jobject returnObj = env->NewObject(cls, constructorId);
        if(returnObj == 0 || returnObj == NULL){

            return NULL;
        }

        jfieldID  bytePubId = env->GetFieldID(cls, "publicKey", "[B");
        if(bytePubId == 0 || bytePubId == NULL){

            return NULL;
        }

        jbyteArray pub_bytes = (jbyteArray)(env->GetObjectField(returnObj, bytePubId));
        if(pub_bytes == 0 || pub_bytes == NULL){

            return NULL;
        }
        jbyte* b = env->GetByteArrayElements(pub_bytes, NULL);
        memcpy(b, publicKey, 64);
        env->ReleaseByteArrayElements(pub_bytes, b, 0);


        jfieldID  bytePriId = env->GetFieldID(cls, "privateKey", "[B");
        if(bytePriId == 0 || bytePriId == NULL){

            return NULL;
        }

        jbyteArray pri_bytes = (jbyteArray)(env->GetObjectField(returnObj, bytePriId));
        if(pri_bytes == 0 || pri_bytes == NULL){

            return NULL;
        }
        jbyte* bb = env->GetByteArrayElements(pri_bytes, NULL);
         memcpy(bb, privateKey, 32);
         env->ReleaseByteArrayElements(pri_bytes, bb, 0);

        return returnObj;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...