Có cần phải chuyển đổi char * thành jbyteArray, sau đó gọi hàm xâu chuỗi của java để tạo ra một chuỗi không? Làm thế nào khác nó có thể được thực hiện? Hãy giúp tôi.Chuyển đổi char * thành jstring trong JNI, khi char * được truyền bằng cách sử dụng va_arg
static int testhandler(void *arg, ...)
{
int i;
struct callback *cb = (struct callback *)arg;
JNIEnv *env = cb->env;
char *sig = cb->signature;
jint size = (jint) strlen(sig);
jint size1;
va_list arguments;
jobjectArray return_array;
jclass obj_class;
jbyteArray bytes;
jstring str;
obj_class = (*env)->FindClass(env, "java/lang/Object");
return_array = (*env)->NewObjectArray(env, size, obj_class, NULL);
va_start(arguments, arg);
for (i = 0; i < size; i++) {
jclass clazz;
jmethodID id;
jobject obj;
jobject encoding;
switch (sig[i]) {
case 'i': {
clazz = (*env)->FindClass(env, "java/lang/Integer");
id = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
obj = (*env)->NewObject(env, clazz, id, va_arg(arguments, uint32_t));
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
case 'l': {
clazz = (*env)->FindClass(env, "java/lang/Long");
id = (*env)->GetMethodID(env, clazz, "<init>", "(J)V");
obj = (*env)->NewObject(env, clazz, id, va_arg(arguments, uint64_t));
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
case 's': {
clazz = (*env)->FindClass(env, "java/lang/String");
size1 = (jint) strlen(va_arg(arguments, char *));
id = (*env)->GetMethodID(env, clazz, "<init>", "([BLjava/lang/String;)V");
encoding = (*env)->NewStringUTF(env, va_arg(arguments, char *));
bytes = (*env)->NewByteArray(env, size1);
(*env)->SetByteArrayRegion(env, bytes, 0, size1, (jbyte *)(va_arg(arguments, char *)));
str = (jstring)(*env)->NewObject(env, clazz, id , bytes);
obj = (*env)->NewObject(env, clazz, id, str);
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
default: {
printf("unknown signature char '%c'\n", sig[i]);
}
}
}
va_end(arguments);
(*env)->CallVoidMethod(env, cb->handler, cb->id, return_array);
return 0;
}
Thứ nhất, tôi không hiểu, tại sao khi 'env' có kiểu' JNIEnv * 'уоu viết' (* env) -> SomeFunc'? Mã này có biên dịch không? Thứ hai, chọn một trong các biến thể sau: hướng đối tượng: 'env-> SomeFunc (params)' hoặc Kiểu C: 'SomeFunc (env, params)'. –
@TsarIoann Anh ấy đang sử dụng kiểu C. Nó là "hướng đối tượng" C, nơi bạn phải sử dụng '(* env) -> SomeFunc (env, xyz)'. Nó hoàn toàn chính xác: http://stackoverflow.com/a/936148/1350762 – maba
@maba Oh my god. Lấy làm tiếc. Câu trả lời được đưa ra bởi mkaes là chính xác. –