我正在尝试编译一个使用命令行中的碳的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开发的。
答案 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