对 `JNI_CreateJavaVM' linux 的未定义引用
Posted
技术标签:
【中文标题】对 `JNI_CreateJavaVM\' linux 的未定义引用【英文标题】:undefined reference to `JNI_CreateJavaVM' linux对 `JNI_CreateJavaVM' linux 的未定义引用 【发布时间】:2013-05-31 14:46:36 【问题描述】:我正在尝试熟悉 JNI API,但无法编译示例 C++ 程序。
这是我用来编译的命令,下面是我要编译的程序。我得到的错误是:
/tmp/cczyqqyL.o: In function `main':
/home/nc/Desktop/jni/simple/ctojava/callJava.cpp:16: undefined reference to `JNI_CreateJavaVM'
编译:
g++ -g -I/usr/lib/jvm/java-7-oracle/include/ -I/usr/lib/jvm/java-7-oracle/include/linux/ -L/usr/bin/java -L/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/ -ljvm callJava.cpp
C++:
#include <jni.h> /* where everything is defined */
int main()
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=/home/nc/Desktop/jni/simple/ctojava/";
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
/* Create the Java VM */
int res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); // this is what it can't find
/* invoke the Main.test method using the JNI */
jclass cls = env->FindClass("Hello");
jmethodID mid = env->GetStaticMethodID(cls, "staticInt", "(I)I");
env->CallStaticVoidMethod(cls, mid,10);
/* We are done. */
jvm->DestroyJavaVM();
我已经搜索了这个问题并尝试了我找到的所有解决方案,但仍然遇到相同的错误...非常感谢任何帮助!
编辑:Joni 在下面的回答有效(取决于您的编译器)。万一其他人发现:运行编译输出时不要忘记 LD_LIBRARY_PATH=_path_to_your_libjvm.so_ 否则它将无法在运行时找到该库。
LD_LIBRARY_PATH=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server ./a.out
【问题讨论】:
这应该会有所帮助:***.com/questions/9923495/… 【参考方案1】:GCC 查找符号的方式最近发生了变化:现在要链接的单元严格从左到右处理,如果命令行中左侧没有需要它们的库 (-lYourLibrary
) 的引用,它们将被静默忽略.
要解决此问题,请将-ljvm
移到使用它的编译单元之后,例如移到命令行的最后:
g++ -g -I/usr/lib/jvm/java-7-oracle/include/ -I/usr/lib/jvm/java-7-oracle/include/linux/ \
-L/usr/bin/java -L/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/ callJava.cpp -ljvm
【讨论】:
以上是关于对 `JNI_CreateJavaVM' linux 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章
Mac上解决dose not contain the JNI_CreateJavaVM symbol
Mac上解决dose not contain the JNI_CreateJavaVM symbol
linux 上的 JNI_CreateJavaVM 会破坏堆栈?