2012-03-09 38 views

Trả lời

23

Có nhiều cách hợp lệ để gọi lại vào Java từ C/C++. Tôi sẽ cho bạn thấy một kỹ thuật sử dụng C (dễ điều chỉnh env cho C++), giúp dễ dàng truyền dữ liệu từ mã nguồn gốc sang mã Java. Ví dụ này chuyển các chuỗi (dễ sửa đổi đối với bất kỳ loại dữ liệu nào).

Trong mã nguồn gốc, tạo điều sau đây:

// Globals 
static jmethodID midStr; 
static char * sigStr = "(Ljava/lang/String;ILjava/lang/String;)V"; 

// Init - One time to initialize the method id, (use an init() function) 
midStr = (*env)->GetMethodID(env, class, "javaDefineString", sigStr); 

// Methods 
static void javaDefineString(JNIEnv * env, jobject o, char * name, jint index, char * value) { 
    jstring string = (*env)->NewStringUTF(env, name); 
    (*env)->CallVoidMethod(env, o, midStr, string, index, (*env)->NewStringUTF(env, value)); 
} 

Trong mã Java tạo như sau:

Map<String, String> strings = new HashMap<String, String>(); 

// Never call this from Java 
void javaDefineString(String name, int index, String value) { 
    String key = name + "." + index; 
    strings.put(key, value); 
} 

sử dụng Native để gửi dữ liệu:

javaDefineString(env, o, "Greet", 0, "Hello from native code"); 
javaDefineString(env, o, "KeyTimeout", 0, "one second"); 
javaDefineString(env, o, "KeyTimeout", 1, "two second"); 

sử dụng Java để nhận dữ liệu:

System.out.println(strings.get("Greet.0"); 
System.out.println(strings.get("KeyTimeout.0"); 
System.out.println(strings.get("KeyTimeout.1"); 
+0

Hi đã thử nhưng điều này nói ... "lỗi: 'javaDefineString' không được khai báo trong phạm vi này". Vì nó không phải là phương pháp JNI thì làm thế nào tôi có thể khai báo trong tập tin header .h. Bất kì lời đề nghị nào? – CoDe

+0

@Shubh Mở một câu hỏi mới và thêm mã và thông tin lỗi của bạn. Chuck – Java42

+1

Đối với những người tự hỏi, 'lớp' có thể thu được với:' class = (* env) -> GetObjectClass (env, o); ' – Diego

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