C++内から任意のJavaコードを実行する必要があります。これにJNIを使用していますが、問題が発生しました。C ++ファイルは正常にコンパイルされますが、実行すると次のように生成されます。
致命的なエラーがJavaランタイム環境によって検出されました。
pc = 0xb6f90ffb、pid = 10063、tid =3062122240でのSIGSEGV(0xb)
JREバージョン:7.0_10-b18 Java VM:Java HotSpot(TM)サーバーVM(23.6-b04混合モードlinux-x86)問題のあるフレーム:V [libjvm.so + 0x440ffb] JNI_ArgumentPusherVaArg :: JNI_ArgumentPusherVaArg(_jmethodID *、char *)+ 0x1b
コアダンプが書き込まれました。デフォルトの場所:/ home / alex / candjava/coreまたは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();
}
これに関する助けをいただければ幸いです。