gpt4 book ai didi

java - 使用 JNI 从 Cocoa 调用 Java 类函数

转载 作者:行者123 更新时间:2023-12-03 16:23:35 25 4
gpt4 key购买 nike

我真的很难弄清楚如何使用 JNI 从 Objective-C 调用 Java 函数。

首先我应该说我对 Java 不太了解,但对 Obj-C 非常熟悉。我有一个 Java 类,其中有一个方法,我需要从应用程序包中调用该方法。该 jar 位于 bundle 中的 Resources 文件夹内,我将 NSJavaRoot 设置为 Content/Resources,选中 NSJavaNeeded 并检查 NSJavaPath 包含 2 个 jar 文件的名称(主要的一个和一个依赖项)。

我使用调用 JNI_CreateJavaVM 来启动虚拟机,然后尝试使用 NSClassFromString 查找该类,这感觉不对,但这是我找到的唯一方法我的搜索。我相信在使用已弃用的 Java 桥时此方法是正确的,但我找不到任何使用 JNI 的示例或引用。

我的 Java 类如下所示:

package foo;

public class bar {

public function dostuff() {

}

}

作为应用程序流程的一部分,我需要调用一次 dostuff() 。有人知道如何做到这一点吗?

谢谢,J

最佳答案

由于 JavaBridge 已被弃用,因此您必须使用 JNI 来完成这一切。在 MacOS 上,您需要将 JavaVM.framework 添加到您的项目中,并且从您的源文件中,您要查找的 header 是:

#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);

并且应该调用该方法。在任何这些阶段之后,您可能需要检查虚拟机以查看是否存在异常。您可以通过执行以下操作来检查是否发生异常:

if (JNIEnv->ExceptionCheck(JNIEnv))
{
// Handle the exception...
}

如果您想要实际的 throwable,您可以使用 ExceptionOccurred JNI 方法来获取它。

所以,这就是最简单的:如何使用 JNI 从 Cocoa 调用 Java 方法。您将需要阅读 JNI 文档,特别是有关了解全局引用和本地引用之间的差异的部分。 (即让你的 Cocoa 端引用持续足够长的时间,以便在它们创建的范围之外被调用。)事实上,有一整章讨论常见的错误和陷阱,其中许多你都会遇到。

http://java.sun.com/docs/books/jni/

祝你好运!

关于java - 使用 JNI 从 Cocoa 调用 Java 类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com