Blueimp 論壇首頁 歡迎 Friend   | 登入
  搜尋  
  首頁  | 討論區  | 最新話題  | 搜尋  | XML
得到15min | 抓寶人生 | 旅行 | 藍瘦香菇 | 小樽世界 | 博客來購書

此話題中所有文章數: 1 [ 話題狀態: 一般 ]
上一話題 此文章已經觀看 4011 次 而且有 篇回應
會員大頭照
男寶寶 jieh
《騎士團團長》
文章: 6291

Registry a java callback method to any C++ task-thread



這篇是我們討論要讓 C++ 呼叫 Java 執行結果的可能性時,C 同事提供的資料,尚未 study 且 J 同事還沒實作出來並與 K 同事的 C++ 語言整合。

http://mqjing.blogspot.com/2008/01/java-c-callback-java-method.html

Registry a java callback method to any C++ task-thread ...

Sometimes, in java application, we will launch a C++ working thread to do a high computing consuming job. When the job done, send a notification to the java application.

You can use a Message to finish the requirement.Also, you can use JNI to invoke any method of a java object that are referenced from the parameter jobject.

If you invoke the Java method in other thread in C++, you will face a problem! The JNI interface pointer (JNIEnv) is valid only in the current thread.If you want to access java object at other thread, you should use AttachCurrentThread to attach current thread to the java virtual machine.



How to use AttachCurrentThread in your code? An example is listed as following.


JNIEXPORT jint JNICALL Java_xxx(JNIEnv *env, jobject jobj, ...){

...

Data->jobj = env->NewGlobalRef(jobj);

// 建立 c++ thread, 執行高耗時程序, 完成時, call back 到 java method

}

=============== Other C++ thread method ==============

// Step 1: 目前的 JVM 取得 env 的範例

JNIEnv* env;
int bOk=curJavaVM->AttachCurrentThread((void**)&env, (void*) 0);


// Step 2: 取得 jclass 和 method Id

// 注意:

// 如果你的java callback 是 static method, 可以使用 FindClass

// 例如: jclass cls=env->FindClass("xxx/myclass");

// 但是, 如果你呼叫的 java callback 是一般 method , 則

// 請使用 GetObjectClass, 範例如下: 其中 jobj 為傳進來 jobject

jclass cls=env->GetObjectClass(Data->jobj);


jmethodID mid=env->GetMethodID(cls,"myfunction", "(I)V");


// Step 3: 利用 env 呼叫 放在 java 物件中的 method

env->CallVoidMethod(Data->jobj, mid, 123);
if(env->ExceptionOccurred()) {
printf("error occured on render2_callback method");
env->ExceptionDescribe();
env->ExceptionClear();
}

// Step 4: 因為 jobj 使用 NewGlobalRef , 所以記得移除
env->DeleteGlobalRef(Data->jobj);


其他程式


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
curJavaVM=vm; // 取得 目前vm
return JNI_VERSION_1_2;
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
{
}


----------------------------------------
支持小惡魔
BTC : 19tn3RnCuwZVukXAwyhDWZD4uBgUZoGJPx
LTC : LTFa17pSvvoe3aU5jbmfcmEpo1xuGa9XeA
知識跟八卦一樣,越多人知道越有價值;知識最好的備份方法,散播!
藍色小惡魔(林永傑): 臉書
----------------------------------------
[編輯文章 2 次, 最後修改: jieh 於 2011/8/24 下午 02:14:38]
[2011/8/24 下午 02:13:33] 友善列印   [返迴此篇文章頂端 ]  回到頂端 
[顯示可以列印的版本]