2010-10-10 92 views
1

因此,我正在編寫一個使用大型C++庫的Android應用程序。我有一切工作,以便java應用程序可以調用C++委託方法,但我發現自己希望我可以將消息從C++記錄到Android日誌。這很容易從java中,但我不知道如何從C++調用java方法。我的搜索找到了從C++中打開jvm的方法,這完全不是我想要做的。理想情況下,我想將一個日誌方法指針傳遞給C++,然後可以隨時使用它。當然,java不支持方法指針。我的java方法看起來像這樣:如何從JNI中的C++調用Java方法

private void log(String s){ 
    Log.i(Tag, s);  // Android log 
} 

我只是不知道如何讓c + +訪問此方法。

+0

可能重複的[如何調用選自C Java方法++](http://stackoverflow.com/questions/2617313/how-to-call-java-method-from-c)參見[使用JNI方法調用C++?](http://stackoverflow.com/questions/945087/method-calls-in-c-with-jni) – 2010-10-10 20:50:00

+0

就是這樣。謝謝! – erock2112 2010-10-10 23:34:58

回答

6

C++調用coutprintf在LogCat輸出中不會顯示。有兩種解決方案。

  1. 使用NDK提供的記錄宏允許您將消息記錄到LogCat。這對於您正在編寫的新代碼和包裝代碼很有用,但是當您擁有一個充滿現有調試語句的庫時不太好。我定義宏如下:

    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info) 
    #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error) 
    

    ,然後在源代碼中我可以調用LOG_INFO("Library is called!");

  2. 捕獲標準輸出/標準錯誤的程序和它漏斗進入logcat的。從Android Debug Bridge頁:

    查看輸出和錯誤

    默認情況下,Android系統發送stdout和stderr(System.out和System.err的)輸出到/ dev/null的。在運行Dalvik VM的進程中,您可以讓系統將輸出的副本寫入日誌文件。在這種情況下,系統使用日誌標記stdout和stderr將消息寫入日誌,這兩個日誌標記都具有優先級I.

    要以這種方式路由輸出,請停止正在運行的模擬器/設備實例,然後使用shell命令setprop啓用輸出的重定向。以下是您的操作方法:

    $ adb shell stop 
        $ adb shell setprop log.redirect-stdio true 
        $ adb shell start 
    

    系統將保留此設置,直到您終止仿真器/設備實例。要將該設置用作模擬器/設備實例的默認設置,您可以在設備上添加一個條目到/data/local.prop。的

+0

這正是我想要的。我在模擬器上的/ data /文件夾中添加了一個「local.prop」文件,內容如下: log.redirect-stdio = true 然後我得到stdout到日誌。 – erock2112 2010-10-11 14:49:52

0

記錄放在'#include'頭文件中。

要鏈接.so,請在make文件中放置'LOCAL_LDLIBS:= -L $(SYSROOT)/ usr/lib -llog'。