2

Maven プロジェクトで正常に動作している WebApp (WAR ファイル) があります。

Cファイルからmavenプロジェクト内にあるクラスファイルでJavaメソッドを呼び出したいです。C プログラムはビーグルボードの GPIO 入力を読み取り、それがオンになると Java メソッドを実行します。そのためにJNIを使​​用しています。

従来の HelloWorld Java メソッドを実行できますが、Maven プロジェクトからメソッドを実行したい場合、Java 静的メソッドをロードしようとすると、JVM から致命的なエラーが発生します。

WebApp の /WEB-INF/myapp/classes/classfile/ に C コードを追加しました

クラスファイル:App メソッド:test

私のCプログラム:

JNIEnv* create_vm(JavaVM ** jvm) {

    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    //Path to the java source code
    options.optionString = "-Djava.class.path=./";
    //JDK version. This indicates version 1.6
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
    if(ret < 0)
        printf("\nUnable to Launch JVM\n");
    return env;
}


int main(int argc, char** argv)
{
    int fd, ret, data[64];
    JNIEnv *env;
    JavaVM * jvm;
    env = create_vm(&jvm);
    if (env == NULL)
        return 1;

    fd = ret = open(argv[argc - 1], O_RDONLY);
    printf("open returned %d\n", ret);
    while (1) {
        ret = read(fd, &data, sizeof(data));
        printf("read returned %d\n", ret);
        jclass helloWorldClass = (*env)->FindClass(env, "App");
        printf("appel class\n");
        jmethodID mainMethod = (*env)->GetStaticMethodID(
            env, helloWorldClass, "test", "([Ljava/lang/String;)V");
        printf("appel method\n");
        (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, NULL);

        sleep(2);
    }
    (*jvm)->DestroyJavaVM(jvm);
    exit(0);
}

Java クラス :

package App;
public class App 
{
   public static void test (String[] args){
        System.out.println("Hello World");
   }
}
4

1 に答える 1

0

リバース JNIを使用して調査しましたか?

次の行があることに気付きました。

options.optionString = "-Djava.class.path=./"; //Path to the java source code

クラスパスは、Maven によって生成された jar ファイル、または Java クラス ファイルが配置されているルート ディレクトリのいずれかを指す必要があります。

参照: ClassPath の設定

標準の Maven プロジェクトでは、target/実行時に Maven によって jar が作成されますmvn package。だからあなたはおそらくに変わるでしょ-Djava.class.path=./-cp /target/App.jar

于 2012-08-22T16:20:40.213 に答える