2011-07-02 34 views
3

我一直在撕掉我的頭髮,試圖找出某些在Windows/Visual Studio中的braindead。我在OS X 10.6下有一個JNI庫,我想用Java可執行文件調試並在Xcode下進行調試:單步執行代碼,檢查JNI庫中的變量,設置斷點等。使用Xcode 4/OS X調試JNI代碼10.6

這是一個可用的JNI示例編譯並從命令行運行良好。如果有人可以告訴我如何在Xcode中設置,我會永遠感激。理想情況下,我希望從Xcode中從頭開始逐步執​​行指令,並根據需要從下面的代碼中剪切並粘貼,從而產生可在Xcode 4下調試的內容,並允許我在JNI代碼中設置斷點,檢查變量,請參閱堆棧追蹤等。

爲了表示感謝,我會將20美元寄給第一位給我的指令,如果您給我一個PayPal地址,我可以在我的最後複製這些指令。

在此先感謝!

HelloWorld.java

class HelloWorld { 
    public native String displayHelloWorld(); 

    static { 
     System.loadLibrary("HelloWorldImp"); 
    } 

    public static void main(String[] args) { 
     System.out.println("--> "+new HelloWorld().displayHelloWorld()); 
    } 
} 

HelloWorldImp.mm

#include <stdio.h> 
#include <jni.h> 

#include <string> 

#import <Foundation/Foundation.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

JNIEXPORT jstring JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString* name = @"Yo Cocoa"; 
    std::string s = [name UTF8String];  

    jstring ret = env->NewStringUTF(s.c_str()); 

    [pool drain]; 

    return ret; 
} 

#ifdef __cplusplus 
} 
#endif 

buildjni.sh

gcc -bundle -I/System/Library/Frameworks/JavaVM.framework/Headers -lstdc++ -o libHelloWorldImp.jnilib -framework Foundation HelloWorldImp.mm 
+0

由於沒有這方面的一個蹦極,我要補充的是,20 $的報價,只要我找到一個解決自己和張貼在這裏失效。 :) – membar

回答

3

你在這裏。

建設的lib
你可能知道,在Mac JNI庫必須在形式libFoo.jnilib命名。然後通過調用System.loadLibrary(「Foo」)來加載Java中的lib;
1.創建一個新的動態庫項目。將它命名爲libSomething。這是命名戰的一半。
2.搜索可執行擴展的目標構建設置。默認情況下,它被設置爲dylib。修改它爲jnilib。這是命名戰役的後半部分。
3.將JavaVM框架添加到鏈接的框架。這裏面有JNI的東西。
4.照常生成您的本機頭文件。
5.將它包含在您的項目中並創建一個對應的.m文件。
6.您必須修改jni.h的包含路徑。在mac上,這是<JavaVM/jni.h>使用JavaNativeFoundation框架。我推薦後者。
7.(可選)JavaNativeFoundation提供了許多宏和方法,這些宏和方法將使數據/方法從Java/Objective-C轉換到Java/Objective-C或從Java/Objective-C轉換數據變得更容易。它沒有很好的記錄,但值得調查。如果您決定使用JNF,請在JavaVM框架上使用開放三角形。你會看到JNF是一個子幀。將其拖動到與JavaVM相同的頂層。然後你可以開始使用它。 import <JavaNativeFoundation/JavaNativeFoundation.h>在JNF_COCOA_ENTER上執行Google搜索以查看如何使用JNF的示例

您現在應該可以構建一個有效的jni庫。假設你的代碼沒有錯誤,你就完成了。;-)

調試
我什麼都試過了我對各種網頁找到致富的Xcode下調試JNI工作。它有點奏效,但在加入可可調用時會掛起。但是,用gdb 調試的工作。如果你在emacs中運行gdb,那真的不是那麼糟糕。當然,缺點是如果你還沒有的話,你需要加速emacs和gdb。這裏的要點是:
1.編譯的lib調試符號
2.設置一個斷點在你的java調用代碼的lib加載後,但調用的代碼之前要調試。或者,您可以在其中放置一個showMessageDialog。任何東西都會在正確的位置阻止Java程序。
3.打開Activity Monitor並記下你的java程序的pid。
4.啓動emacs。如果你在Lion上,那麼附帶的終端emacs應該可以工作。在SL終端emacs沒有一些gdb的魔力。不過,在這兩種情況下,我建議你下載並使用mac gui emacs。有多個可用的,我使用我得到的那個here。如果你在終端中使用emacs,你會想要去終端/首選項/設置/鍵盤,往下看。有一個複選框「使用選項作爲元鍵」。你會想要檢查。
5.運行按M-X(選項x)的emacs的。輸入gdb並按回車。你會看到類似「gdb --annotate = 2 xxxxxxxxxx」。按退格鍵,直到進入註釋設置。輸入「pid xxx」,其中xxx是您的java調用應用程序的pid。你最終應該看起來像「gdb --annotate = 2 pid xxxx」。按回車。
6.您應該看到GDB加載你的JNI lib中的符號。
7.現在按M-x。鍵入gdb-many-windows。按回車。
8.您現在應該在emacs中看到多個窗口。 gdb命令窗口,局部變量,源代碼和其他。
9.在命令窗口中輸入break someFunctionName。按Enter鍵。
10.在命令窗口中輸入cont。 (這導致執行繼續)。按回車。
11.現在繼續在Java調試器,或者按在java對話框中輸入。
12.您應該看到GDB命中斷點在你的JNI代碼。
13.研究emacs和gdb。特別是檢查gdb中的po命令。
14.鮑勃是你的叔叔。

享受!

+0

不是我正在尋找的解決方案,但它似乎儘可能地解決了問題,並獲得了A的努力。如果您想收取20美元,請訪問我的網站,並通過Paypal地址向我發送反饋信息。再次感謝。 – membar