由于 JavaBridge 已被弃用,您将不得不使用 JNI 来完成这一切。在 MacOS 上,您需要将 JavaVM.framework 添加到您的项目中,并且从您的源文件中,您要查找的标头是:
#import <JavaVM/jni.h>
接下来您需要设置 JavaVM。这可能很重要,具体取决于您的类路径和其他要求,但您走在正确的轨道上,因为这是您用来创建 JVM 的函数:
JNI_CreateJavaVM(JavaVM **pJVM, void **pJNIEnv, void *args);
接下来,您需要获取对您的类 foo.bar 的引用。这可以使用从 JNI_CreateJavaVM 传递的 pJNIEnv 来完成。你会想打电话:
jclass myClass = JNIEnv->FindClass(JNIEnv, "foo/bar"); // Note the slashes replacing the dots...
假设一切设置正确,您将获得对您的班级的引用。假设 foo.bar 有一个默认的无参数构造函数,你可以得到它的一个实例,像这样:
jobject myFooBar = JNIEnv->NewObject(JNIEnv, myClass);
现在您需要获取 doStuff 方法的 methodID。为此,您需要它的方法签名,您可以通过调用 javap 获得,如下所示:
% javap -s foo.bar
应该产生这样的输出:
Compiled from "bar.java"
public class foo.bar extends java.lang.Object{
public foo.bar();
Signature: ()V
public void doStuff();
Signature: ()V
}
然后您可以使用它来获取方法ID,您需要调用它。像这样:
jmethodID mid = JNIEnv->GetMethodID(JNIEnv, myClass, "doStuff", "()V");
假设所有这些事情都正确,那么你可以这样调用方法:
JNIEnv->CallVoidMethod(JNIEnv, myFooBar, mid);
并且该方法应该被调用。在任何这些阶段之后,您可能需要检查 VM 以查看是否存在异常。您可以通过以下方式检查是否发生异常:
if (JNIEnv->ExceptionCheck(JNIEnv))
{
// Handle the exception...
}
如果你想要实际的 throwable,你可以使用 ExceptionOccurred JNI 方法得到它。
所以,这里是最精简的部分:如何使用 JNI 从 Cocoa 调用 Java 方法。您将需要阅读 JNI 文档,尤其是有关理解全局引用和本地引用之间差异的部分。 (即让你的 Cocoa 端引用持续足够长的时间,以便在它们创建的范围之外被调用。)事实上,有一整章是关于常见错误和陷阱的,其中很多你都会遇到。
http://java.sun.com/docs/books/jni/
祝你好运!