[обновлено] Код ниже работает сейчас, спасибо всем
Я получил несколько массивов 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;
}