2011-07-02 2 views
3

Windows/Visual Studio에서 머리를 짜는 데 어려움을 겪고 있습니다. Java 실행 파일로 호출하고 Xcode 아래에서 디버그하고 싶습니다. 코드를 실행하고, JNI 라이브러리에서 변수를 검사하고, 중단 점을 설정하는 등의 작업을 수행합니다.Xcode 4/OS X 10.6을 사용하여 JNI 코드 디버깅

작동중인 JNI 예제입니다. 커맨드 라인에서 정상적으로 컴파일되어 실행됩니다. 누군가가 Xcode에서 이것을 설정하는 방법을 말해 줄 수 있다면, 나는 영원히 감사 할 것입니다. 이상적으로, 나는 Xcode에서 처음부터 시작하여 적절한 코드를 잘라내어 붙여 넣기하는 단계별 지침을 원합니다. Xcode 4에서 디버깅 할 수있는 기능을 제공하고 JNI 코드에서 중단 점을 설정하고 변수를 검사 할 수있게합니다. , stacktraces 등을 참조하십시오.

감사의 표시로, 제게 Paypal 주소를 알려 주면 제게 재현 할 수있는 지시 사항을 제게주는 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

여기 있습니다.
당신은 아마 맥에 JNI libs가이 양식 libFoo.jnilib에 이름을 지정해야합니다 알고 lib 디렉토리를 구축

. 그런 다음 System.loadLibrary ("Foo")를 호출하여 Java에서 lib를로드합니다.
1. 새 동적 라이브러리 프로젝트를 만듭니다. 이름을 libSomething으로 지정하십시오. 그것은 명명 전투의 절반입니다.
2. 실행 파일 확장명의 대상 빌드 설정을 검색하십시오. 기본적으로 이것은 dylib로 설정됩니다. jnilib로 수정하십시오. 그것은 명명 전투의 두 번째 절반입니다.
3. 링크 된 프레임 워크에 JavaVM 프레임 워크를 추가하십시오. 여기에는 JNI가 들어 있습니다.
4. 평소와 같이 네이티브 헤더 파일을 생성하십시오.
5. 프로젝트에 포함시키고 해당 .m 파일을 만듭니다.
6. jni.h의 포함 경로를 수정해야합니다. 맥에서 이것은 <JavaVM/jni.h>또는은 JavaNativeFoundation 프레임 워크를 사용합니다. 나는 후자를 추천한다.
7. (선택 사항) JavaNativeFoundation은 Java/Objective-C로 데이터/메소드를 변환하는 데 훨씬 많은 매크로와 메소드를 제공합니다. 잘 설명되어 있지는 않지만 조사할만한 가치가 있습니다. JNF를 사용하기로 결정한 경우 JavaVM 프레임 워크에서 열린 삼각형을 사용하십시오. JNF가 서브 프레임 워크라는 것을 알 수 있습니다. JavaVM과 동등한 최상위 레벨로 드래그하십시오. 그런 다음 사용을 시작할 수 있습니다. import <JavaNativeFoundation/JavaNativeFoundation.h> JNF_COCOA_ENTER에서 Google 검색을 수행하여 JNF 사용 방법의 예를 확인하십시오.

이제 유효한 jni 라이브러리를 빌드 할 수 있습니다. 코드에 버그가 없다고 가정하면 끝났습니다.
;-)

디버깅 나는 일을 엑스 코드에서 JNI 디버깅을 얻기 위해 나는 다양한 웹 페이지에서 찾을 모든 노력을. 일종의 일이지만, 코코아 전화를 걸면 걸릴 것입니다. 그러나 gdb 을 사용하여 디버깅을 수행하면이 작동합니다. 이맥스 내에서 gdb를 돌리는 것은 그렇게 나쁘지는 않습니다. 물론 단점은 이미 emacs와 gdb에서 속도를 올릴 필요가 있다는 것입니다. 요점은 다음과 같습니다.
1. 디버깅 기호가있는 lib 컴파일
2. lib가로드 된 후 디버깅 할 코드를 호출하기 전에 Java 호출 코드에 중단 점을 설정하십시오. 또는 거기에 showMessageDialog를 넣을 수도 있습니다. 무엇이든 올바른 시점에서 Java 프로그램을 차단합니다.
3. 활동 모니터를 열고 Java 프로그램의 PID를 기록하십시오.
4. 이맥스를 시작합니다. 라이온을 만난다면 함께 제공되는 단말기 이맥 (emacs)이 작동해야합니다. SL에서 터미널 emacs에는 gdb 마법의 일부가 없습니다. 그러나 두 경우 모두 mac gui emacs를 다운로드하여 사용하는 것이 좋습니다. 사용할 수있는 카드가 두 개 이상 있습니다. 내가 가지고있는 카드를 사용합니다. here. 터미널에서 이맥스를 사용한다면, Termina/Preferences/Settings/Keyboard로 가서 아래쪽을 보길 원할 것입니다. "메타 키로 옵션 사용"체크 박스가 있습니다. 그걸 확인하길 원할거야.
5. 이맥스가 실행되면 M-x (옵션 x)를 누릅니다. gdb를 입력하고 Enter 키를 누릅니다. "gdb --annotate = 2 xxxxxxxxxx"와 같은 것을 볼 수 있습니다. 주석 설정이 될 때까지 백 스페이스 키를 누릅니다. "pid xxx"를 입력하십시오. 여기서 xxx는 Java 호출 응용 프로그램의 pid입니다. "gdb --annotate = 2 pid xxxx"와 같은 줄로 끝나야합니다. 엔터 키를 치시오.
6. jni lib에 대한 심볼을로드하는 gdb가 표시되어야합니다.
7. 이제 M-x를 누릅니다. gdb-many-windows를 입력하십시오. 엔터 키를 치시오.
8. 이맥스에는 여러 개의 창이 보일 것입니다. gdb 명령 창, 지역 변수, 소스 코드 등.
9. 명령 창에 break someFunctionName을 입력하십시오. 엔터 키를 치시오.
10. 명령 창에 cont를 입력하십시오. (이로 인해 실행이 계속됩니다). 엔터 키를 치시오.
11. 이제 Java 디버거에서 계속하거나 Java 대화 상자에서 Enter 키를 누릅니다.
12. jql 코드에서 gdb가 중단 점을 확인해야합니다.
13. emacs 및 gdb에 대해 학습하십시오. 특히 gdb에서 po 명령을 확인하십시오.
14. 그리고 밥은 삼촌입니다.

즐기십시오!

+0

정확히 내가 찾던 해결책은 아니지만 최대한 문제를 해결하는 것으로 보이고 노력을 위해 A를 얻습니다. $ 20를 모으고 싶다면 내 웹 사이트로 이동하여 페이팔 주소로 의견을 보내주십시오. 다시 한번 감사드립니다. – membar