【发布时间】:2014-02-20 16:55:25
【问题描述】:
我有一个本地 C++ 应用程序,它通过 JNI 创建一个 JVM,实例化一个 Java 类(一个 Akka Actor)并在其上调用异步非阻塞函数。我在 C++ 中使用 JNI 执行此操作,请参见下面的 sn-p。
现在,当 Akka 响应到达我的 Akka Actor 时,我需要在 C++ 中得到通知。为此,我需要将本机函数指针传递给 Java,以便 Akka Java Actor 可以在响应到达时回调到 C++。我怎样才能做到这一点?
请注意,在 Akka Actor 中使用线程同步原语是完全错误的,因为如果等待某个监视器被阻塞,Actor 将无法接收消息,例如CountDownLatch。
JavaVM* jvm = NULL;
JNIEnv *env = NULL;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=/home/azg/code/hpcmom/target/1.1.9-SNAPSHOT/hpcmom-cmaes/hpcmom-cmaes-1.1.9-SNAPSHOT.jar";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
// create JVM
JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
if (jvm == NULL) {
throw std::runtime_error("failed creating JVM");
} else {
log_info << "succeeded creating JVM";
}
// find CmaesClient class
jclass cmaesClass = env->FindClass("com/sfoam/hpcmom/cmaes/CmaesClient");
if (cmaesClass == NULL) {
throw std::runtime_error("failed finding CmaesClient class");
} else {
log_info << "succeeded finding CmaesClient class";
}
【问题讨论】:
标签: java c++ callback java-native-interface akka