什么时候-framework和-I / System /.../ Example.framework / Headers / needed?

时间:2009-07-28 04:36:05

标签: c macos java-native-interface macos-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是可选的,另一个框架是必需的,-I是可选的。这是怎么回事?有人可以解释-framework选项是如何工作的吗? JavaVM是一个特例吗?

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

2 个答案:

答案 0 :(得分:1)

框架被考虑用于编译和链接。我对Java一无所知,但也许你的问题与bundle与框架有关:例如,多个框架可以包含在一个bundle中。一个framework may contain other frameworks as well

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

答案 1 :(得分: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