2012-12-13 33 views
0

我在java中創建了一個線程,它執行了一些處理,使用JNI將數據傳遞給傳統C++。 C++代碼在單獨的線程上執行一些任務,然後返回,此時我想從JNI回調到Java線程,而不是主接口線程。該代碼似乎構建並運行沒有錯誤,但是當調用CallVoidMethod來調用回Java時,沒有任何事情發生,沒有任何異常或錯誤,它似乎調用Java代碼。在非UI線程上對Java的JNI回調

我打電話給AttachCurrentThread似乎工作和分離在結束時,找到方法的調用似乎都成功。有沒有人有任何想法或我有錯誤的想法?

+1

在調用方法的開始處添加一條日誌語句,以查看它是否被調用。確保在JNI代碼中調用ExceptionCheck,以查看CallVoidMethod中的Java端是否失敗。你說「什麼事情都沒有發生」,而且「似乎也調用了Java代碼」,所以我不確定你看到了什麼或者它是如何失敗的。 – fadden

+0

如果你粘貼代碼,我們可以建議你 – Suman

回答

2

有沒有解決這個問題的靈丹妙藥;你可能會遇到任何奇蹟般的小事情。我建議直接用一些不起作用的代碼開始。故意設置方法ID錯誤;看看系統的行爲有什麼不同。將對象引用(或類引用,如果它是靜態方法)設置爲意外的對象或不存在的對象;看看當對象引用沒有全局化時會發生什麼......你有這個想法。

+1

Upvote for全球化的對象引用 - 事實證明,如果我想保留對當前方法範圍之外的對象或類的引用,我需要調用'NewGlobalReference()和線程。請參閱http://developer.android.com/training/articles/perf-jni.html#local_and_global_references關於此的良好指南。 – user149408