1

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();

}

これに関する助けをいただければ幸いです。

4

3 に答える 3

2

JNI 関数から返されるエラーをチェックしていません。エラーをチェックする必要があります。

于 2012-12-28T18:28:12.067 に答える
0

ソース コードにいくつかの明らかなエラーがあります。

  1. Main クラスのテスト メソッドは static にする必要があります
  2. テスト パラメータは int である必要があります
  3. java.class.path パラメータがばかげている

3番目の問題もあります。オプションを変更-Djava.class.path=/Path-to-your-class-file-directoryすればOKです。(私のは"-Djava.class.path=.")

于 2014-05-01T02:20:57.480 に答える
0
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");

あなたの関数は無効で、引数として整数を持っていると言います。ただし、整数引数を送信していません。次のようにする必要があります

jmethodID mid = env->GetStaticMethodID(cls, "test", "()V");
于 2013-09-30T14:56:14.230 に答える