我需要从 C++ 中执行一些任意 Java 代码。我正在为此使用 JNI,但遇到了一个问题。C++ 文件编译得很好,但是在执行时会产生以下内容:
Java 运行时环境检测到一个致命错误:
SIGSEGV (0xb) 在 pc=0xb6f90ffb,pid=10063,tid=3062122240
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();
}
对此的任何帮助将不胜感激!