Bạn không có khả năng nhận được bất kỳ việc sử dụng nào ngoài việc chuyển địa chỉ của danh sách va_list lên Java. Dưới đây là một vài đoạn cho thấy cách để vượt qua một mảng bằng cách sử dụng "..." và va_list. Thêm kiểm tra lỗi/ngoại lệ/trả lại khi cần thiết.
Trong Java:
static private void javaDefineArray(Object ... args) {
for (Object o : args) {
print("javaDefineArray " + o);
}
}
Trong C:
// Lookup the method using GetMethodID or GetStaticMethodID
mid = (*env)->GetStaticMethodID(env, class, "javaDefineArray", "([Ljava/lang/Object;)V");
// C function taking variable args (all String in this example)
static void javaDefineArray(JNIEnv * env, jobject o, ...) {
int i = 0;
int count = 0;
char * msg[100+1] = {0}; // 100 args max
jobjectArray ja;
va_list list;
va_start(list, o);
do {msg[count] = va_arg(list,char *);
} while(msg[count] !=0 && ++count < 100); // end/saftey check
va_end(list);
ja = (*env)->NewObjectArray(env, count, (*env)->FindClass(env, "java/lang/String"), (*env)->NewStringUTF(env, ""));
for(i=0;i!=count;i++) {
(*env)->SetObjectArrayElement(env,ja,i,(*env)->NewStringUTF(env, msg[i]));
}
(*env)->CallVoidMethod(env, o, mid, ja);
}
C Cách sử dụng:
javaDefineArray(env, o, "0", "1", "2", "3", "4", NULL);
Java Output:
javaDefineArray 0
javaDefineArray 1
javaDefineArray 2
javaDefineArray 3
javaDefineArray 4
Không một chuyên gia với Java hoặc JNI, nhưng Java varargs về cơ bản là mảng, trong khi các var var là ... lộn xộn và không an toàn. Hàm C của bạn có thể cần xây dựng mảng đúng và gọi hàm Java với điều đó. –
Có, tôi có thể xây dựng một mảng đối tượng, nhưng tôi hy vọng rằng tồn tại giải pháp tốt đẹp hơn. Ví dụ java constructor invocation có phương thức nhận C valist –
@Pavel: Tôi nghĩ bạn đang đánh giá quá cao JNI. Bạn đang mở để sử dụng JNA? Tôi biết rằng nó có thể tạo các phương thức varargs của Java bao bọc các hàm var vars, tôi không biết liệu nó có thể làm điều ngược lại hay không. –