0

我正在尝试从命令行编译一个使用 carbon 的 JNI 库。

如果我不 -I/System/.../JavaVM.Framework/Headers/,它找不到任何 jni 类型,并给出错误。

如果我只是 -I/System/.../FlatCarbon.framework/Headers 而不是“-framework Carbon”,它编译得很好,但是链接器给出了一个关于未定义符号的错误。

如果我使用 -framework Carbon 编译,它可以正常工作,但事实证明 -I.../FlatCarbon.framework/Headers/ 完全没有必要!无论有没有它,它的工作原理都是一样的。现在,到目前为止,一切都是有道理的,除了以下内容:

如果 I -framework JavaVM,但包含头目录,则找不到 jni 类型!

这似乎完全不一致。对于一个框架,-I 是必需的,-framework 是可选的,对于另一个框架,-framework 是必需的,-I 是可选的。这是怎么回事?有人可以解释 -framework 选项的工作原理吗?JavaVM 是一个特例吗?

出于好奇,我部分发布了这个问题,但也是为了帮助其他正在寻找类似解决方案的人,因为至少在我的 google-fu 中,我无法从命令行找到任何解释框架的内容,或者如何在命令行上使用 gcc 链接到系统库。gcc --help 甚至没有记录 -framework,我能找到的一切都是关于使用 xcode 开发的。

4

2 回答 2

1

框架被考虑用于编译和链接。我对java一无所知,但也许您的问题与捆绑包与框架有关:例如,捆绑包中可以包含多个框架。一个框架也可能包含其他框架

不幸的是,这些特定于 mac 的东西通常没有记录在手册页中。

于 2009-07-28T08:53:16.920 回答
1

“-framework”对于编译阶段和链接阶段都足够了。我猜您的 JNI 代码没有正确引用 jni.h 标头(可能缺少对封闭 JavaVM 框架的引用)。

代码如:

#include <JavaVM/jni.h>

JNIEXPORT jstring JNICALL Java_SomeClass_getStr(JNIEnv *env, jobject obj)
{
    jstring javaName = (*env)->NewString(env, (jchar *)"ana", (jsize)3);
    return javaName;
}

编译:

gcc -dynamiclib My.c -o My.o -framework JavaVM
于 2009-11-13T19:09:42.023 回答