2011-07-02 54 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