假设您有以下代码
#include "jni.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
options[0].optionString = "-Djava.class.path=_HERE_GOES_LOCATION_OF_JNICOOKBOK_/jnicookbook/recipeNo051/target";
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
int status = JNI_CreateJavaVM (&jvm, (void **) &env, &vm_args);
if (status < 0 || !env) {
printf ("Error - JVM creation failed\n");
return 1;
}
jclass cls_Main = (*env)->FindClass (env, "recipeNo051/Main");
jmethodID method_displayMessage = (*env)->GetStaticMethodID (env, cls_Main, "displayMessage", "()V");
(*env)->CallStaticVoidMethod(env, cls_Main, method_displayMessage);
(*jvm)->DestroyJavaVM( jvm );
}
return 0;
}
为了运行它,你需要
-
libjvm.dylib 的位置
- 标头位置
- 从
main.m 调用的已编译 Java 类的位置
让我们从库和头文件开始。您必须确保搜索包含以下路径(注意我使用的是 jdk-11.0.4):
/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/include
/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/include/darwin/
您必须确保将以下路径添加到 Library Search Path 和 Runpath Search Paths
/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/lib/server
你应该有这样的设置:
确保您将代码与libjvm.dylib 链接。将其添加到Build Phases
您可以通过选择Add Other...来指定它的位置
运行您的代码,但是!确保在调用方法JNI_CreateJavaVM 之前忽略SIGSEGV。您可以在lldb 控制台中忽略它
(lldb) process handle --pass true --stop false SIGSEGV
继续后,您可以看到您的JVM 实例从recipeNo051 调用类。
类的源代码:recipeNo051/Main可以在这里找到:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo051
更新