2012-12-28 21 views
1

我需要從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(); 

} 

任何幫助,將不勝感激!

+1

這是一個很奇怪的班級路徑。 – bmargulies

+0

這個選項不應該有空格,它應該指向某些Java類的位置''-D java.class.path =/usr/lib/jvm/java-7-oracle/bin「' –

回答

2

您不檢查JNI函數返回的任何錯誤。你需要檢查錯誤。

+0

http ://stackoverflow.com/questions/7559059/jni-env-getstaticmethodid-crashed-program 我使用該鏈接中列出的代碼來解決我的問題,謝謝 – alexenk

0
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V"); 

說你的函數是無效的,你有整數作爲參數。 但你不發送任何整數參數 它必須是如下

jmethodID mid = env->GetStaticMethodID(cls, "test", "()V"); 
0

有在源代碼中一些明顯的錯誤。

  1. 在主類的測試方法應該是靜態
  2. 測試參數應該是int
  3. 的java.class.path參數是荒謬

我也有第三個問題。改變選項-Djava.class.path=/Path-to-your-class-file-directory就可以了。(我的是"-Djava.class.path=."

相關問題