2012-01-16 26 views
8

tôi có phương pháp C với varargsthế nào gọi phương thức vararg java từ C với valist

void message(int id, ...) 

Và nó nên gọi Java phương pháp tĩnh với vararg

public static void message(String messageName, String ... args) 

Làm thế nào tôi có thể làm điều đó bằng C valist và JNI API?

Cảm ơn bạn!

+2

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 đó. –

+0

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 –

+0

@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. –

Trả lời

7

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 
+0

nếu bạn không biết loại vararg args thì sao? giả sử gọi là 'javaDefineArray (env, o," 0 ", 1," 56 ", 17.3)'? – 4ntoine

+0

Tạo câu hỏi mới và tham khảo câu hỏi này và xem liệu ai đó có thể hỗ trợ cho sự cố không. – Java42

Các vấn đề liên quan