这是我所拥有的:
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?但是我该怎么做呢?