我一直在努力寻找Windows / Visual Studio中脑筋急转弯的东西.我有一个要在OS X 10.6下使用的JNI库,我想使用Java可执行文件调用它并在Xcode下进行调试:单步执行代码,检查JNI库中的变量,设置断点等.
这是一个有效的JNI示例,可以从命令行编译并正常运行.如果有人可以告诉我如何在Xcode中进行设置,我将不胜感激.理想情况下,我想要分步说明,从Xcode的头开始,并适当地从下面的代码剪切和粘贴,以产生可在Xcode 4下调试的东西,并允许我在JNI代码中设置断点,检查变量,请参见stacktraces等.
为表示感谢,我将向第一位提供20美元指示的人发送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
解决方法:
干得好.
建立库
您可能知道Mac上的jni lib必须以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之间的数据/方法转换变得容易得多.它没有很好的文档记录,但是值得研究.如果决定使用JNF,请使用JavaVM框架上的空心三角形.您将看到JNF是子框架.将其向上拖动到等于JavaVM的顶层.然后,您可以开始使用它.导入< JavaNativeFoundation / JavaNativeFoundation.h>在JNF_COCOA_ENTER上进行Google搜索,以查看有关如何使用JNF的示例
您现在应该能够构建有效的jni库.假设您的代码中没有错误,那么您就完成了.