我需要從C++內部執行一些任意的Java代碼。我正在爲此使用JNI,但遇到了問題。 C++的文件編譯正常,但是在執行時產生以下:在g ++編譯+ jni鏈接之後進行核心轉儲,然後使用C++和Java執行應用程序
已經由Java運行時環境中檢測到致命錯誤:
SIGSEGV(0XB)在PC = 0xb6f90ffb,PID = 10063,TID = 3062122240
JRE版本:7.0_10-B18 的Java VM:爪哇的HotSpot(TM)服務器VM(23.6-B04混合模式Linux 86) 有問題的幀: V [libjvm.so + 0x440ffb] JNI_ArgumentPusherVaArg :: JNI_ArgumentPusherVaArg(_jmethodID *,char *)+ 0x1b
寫入核心轉儲。默認位置:/首頁/亞歷克斯/ candjava /芯或core.10063
更多信息的錯誤報告文件保存爲: /home/alex/candjava/hs_err_pid10063.log
如果你想提交錯誤報告,請訪問: http://bugreport.sun.com/bugreport/crash.jsp
中止(核心轉儲)
的編譯命令:
g++ sample.cpp -o app -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -I $JAVA_HOME/jre/lib/i386/client -L$JAVA_HOME/jre/lib/i386/client -ljvm -Wno-write-strings
其中$JAVA_HOME
是/usr/lib/jvm/java-7-oracle
Java源:
public class Main{
public void test(){
System.out.println("HELLO WORLD");
}
}
的C++源:
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <string.h>
int main()
{
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-D java.class.path=/usr/lib/jvm/java-7-oracle/bin";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options;
/* invoke the Main.test method using the JNI */
jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
env->CallStaticVoidMethod(cls, mid, 100);
/* We are done. */
jvm->DestroyJavaVM();
}
任何幫助,將不勝感激!
這是一個很奇怪的班級路徑。 – bmargulies
這個選項不應該有空格,它應該指向某些Java類的位置''-D java.class.path =/usr/lib/jvm/java-7-oracle/bin「' –