2011-07-02 3 views
3

Windows/Visual Studioで頭が痛いものを見つけようとしています。私はOS X 10.6の下でJava実行可能ファイルを呼び出し、Xcodeの下でデバッグしたいコードを実行し、JNIライブラリ内の変数を調べ、ブレークポイントを設定したいと思っています。Xcode 4/OS X 10.6を使用したJNIコードのデバッグ

ここではJNIの実例コマンドラインからコンパイルして正常に動作します。誰かがXcodeでこれを設定する方法を教えてもらえれば、私は永遠に感謝しています。理想的には、Xcodeの最初から段階的な手順を開始し、適切な下のコードを切り貼りしてXcode 4でデバッグ可能なものを作成し、JNIコードにブレークポイントを設定して変数を調べることができます、スタックトレースなどを参照してください。

感謝の念として、あなたが私にペイパルのアドレスを与えると私が私の最後に再現できるような指示を私に与える最初の人に20ドルを送ります。

ありがとうございます!

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

ここに行きます。あなたはおそらくMac上でJNI LIBSフォームlibFoo.jnilibで命名されなければならないことを知っているのlib
を構築

。次に、System.loadLibrary( "Foo")を呼び出してJavaからlibをロードします。
1.新しいダイナミックライブラリプロジェクトを作成します。それにlibSomethingという名前を付けます。それは命名の戦いの半分です。
2. Executable Extensionのターゲットビルド設定を検索します。デフォルトでは、これはdylibに設定されています。それをjnilibに変更します。それは命名の戦いの後半です。
3.リンクされたフレームワークにJavaVMフレームワークを追加します。これにはJNIが含まれています。
4.通常どおりにネイティブヘッダーファイルを生成します。
5.これをプロジェクトに組み込み、対応する.mファイルを作成します。
6. jni.hのインクルードパスを変更する必要があります。 MacではまたははJavaNativeFoundationフレームワークを使用しています。私は後者をお勧めします。
7.(オプション)JavaNativeFoundationには、Java/Objective-Cとのデータ/メソッドの変換をより簡単にするためのマクロとメソッドが多数用意されています。それは十分に文書化されていませんが、調査する価値があります。 JNFを使用する場合は、JavaVMフレームワークの白い三角形を使用します。 JNFがサブフレームワークであることがわかります。 JavaVMと同じレベルにドラッグします。その後、あなたはそれを使い始めることができます。 import <JavaNativeFoundation/JavaNativeFoundation.h> JNF_COCOA_ENTERでGoogle検索を行い、JNFの使用例を確認してください

これで、有効なjniライブラリを構築できるようになりました。あなたのコードにバグがないと仮定すると、あなたは完了です。
;-)

デバッグは私が仕事にXcodeの下JNIをデバッグ得るために、私は、様々なWebページ上で見つかったすべてのものを試してみました。それはうまくいっていますが、ココアコールを踏むとハングアップします。しかし、gdb でデバッグすると、が動作します。 emacs内でgdbを実行すると、それほど悪くないわけではありません。もちろん、欠点は、emacsとgdbの速度を上げる必要があるということです。
1. libをデバッグシンボルでコンパイルします。
2. libをロードした後、デバッグするコードを呼び出す前に、Java呼び出しコードにブレークポイントを設定します。あるいは、そこにshowMessageDialogを置くこともできます。何かが正しいポイントでJavaプログラムをブロックします。
3.アクティビティモニタを開き、JavaプログラムのPIDをメモします。
4. emacsを起動します。あなたがライオンにいる場合は、付属の端末のemacsが動作するはずです。 SLでは、端末のemacsはgdbの魔法の一部を持っていません。しかし、どちらの場合でも、Mac gui emacsをダウンロードして使用することをお勧めします。使用可能なものが複数あります。私はhereを使用しています。ターミナルでEmacsを使用している場合は、Termina/Preferences/Settings/Keyboardに行き、下に向かって見てください。 「メタキーとしての使用」チェックボックスがあります。あなたはそれをチェックしたいでしょう。
5. emacsを実行してM-x(オプションx)を押します。 gdbと入力し、Enterキーを押します。 "gdb --annotate = 2 xxxxxxxxxx"のようなものが表示されます。アノテート設定になるまでバックスペースを押します。 「pid xxx」と入力します。ここで、xxxはJava呼び出しアプリのpidです。あなたは "gdb --annotate = 2 pid xxxx"のような行で終わるべきです。 Enterを押します。
6. jni libのシンボルをロードするgdbが表示されます。
7. M-xを押します。 gdb-many-windowsと入力します。 Enterを押します。
8. emacsに複数のウィンドウが表示されるはずです。 gdbコマンドウィンドウ、ローカル変数、ソースコードなど。
9.コマンドウィンドウにbreak someFunctionNameと入力します。 Enterを押します。
10.コマンドウィンドウにcontを入力します。 (これにより、実行が続行されます)。 Enterを押します。
11. Javaデバッガで続行するか、Javaダイアログでenterキーを押します。
12. jqlコードでgdbがブレークポイントをヒットするはずです。
13. emacsとgdbについて調べてください。特にgdbのpoコマンドをチェックしてください。
14.ボブはあなたの叔父です。

お楽しみください!

+0

正確には私が探していた解決策ではありませんが、できるだけ問題を解決するように思われ、あなたは努力のためにAを取得します。 20ドルを徴収したいのであれば、私のウェブサイトに行き、あなたのPaypalアドレスのフィードバックメッセージを私に送ってください。再度、感謝します。 – membar

関連する問題