执行 Google JNI-BIND C++ 程序时,如何告诉其嵌入式 JVM 到哪里寻找 Java 类文件?

问题描述 投票:0回答:0

这是我所拥有的:

HelloWorld.java

package com.test;

public class HelloWorld {

    public void sayHello(String msg) {
        System.out.println("Hello from Java: " + msg);
    }
}

编译它:

$ javac com/test/HelloWorld.java

Google JNI-BIND C++代码:

#include "jni_bind_release.h"


// 1: Setup JNI Bind in your OnLoad call (needed only once).
std::unique_ptr < jni::JvmRef < jni::kDefaultJvm >> jvm;

extern "C" {
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * pjvm, void * ) {
        jvm.reset(new jni::JvmRef < jni::kDefaultJvm > (pjvm));
        return JNI_VERSION_1_6;
    }
}

int main() {

    // 2: Define the class
    static constexpr jni::Class kClass {
        "com.test.HelloWorld",
        jni::Method {
            "sayHello",
            jni::Return < void > {},
            jni::Params < jstring > {}
        }
    };

    // 3: Use the class
    jni::LocalObject < kClass > obj {}; // Constructs new instance.

    obj("sayHello", "a cool string from C++");

    return 0;
}

我在本地 jni_bind 文件夹中有 JNI-BIND 源。所以为了编译上面的代码,我在 Mac 上做

$ tree -L 1
.
├── HelloWorld.cpp
├── com
└── jni_bind

$ tree com
com
└── test
    ├── HelloWorld.class
    └── HelloWorld.java

C++编译:

$ clang++ -std=c++17 -I./jni_bind -I"$JAVA_HOME/include"
-I"$JAVA_HOME/include/darwin/" HelloWorld.cpp -o HelloWorld

编译得很好,太棒了!

但是现在当我运行它时,我遇到了分段错误,因为它无法找到要加载的

./com/test/HelloWorld.class
文件。

$ ./HelloWorld
zsh: segmentation fault  ./HelloWorld

设置 CLASSPATH 也不起作用:

$ CLASSPATH=. ./HelloWorld
zsh: segmentation fault  CLASSPATH=. ./HelloWorld

也许我必须设置

JavaVMOption
-Djava.class.path=.
传递给它的嵌入式 JVM?但是我该怎么做呢?

java c++ java-native-interface
© www.soinside.com 2019 - 2024. All rights reserved.