使用JNI从可可拨打Java类功能

 2023-01-20    353  

问题描述

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

我应该开始说我对Java一无所知,但对OBJ-C非常熟悉.我有一个带有单个方法的Java类,我需要从应用程序捆绑包中调用. jar在捆绑包中的资源文件夹内部,我将NSJavaRoot设置为Content/Resources,NSJavaNeeded被检查,NSJavaPath包含2个jar文件的名称(主一个和一个依赖关系).

使用JNI从可可拨打Java类功能

我正在使用对JNI_CreateJavaVM的调用来启动VM,然后尝试使用NSClassFromString找到类,这感觉是错误的,但这是我在搜索中找到的唯一方法.我相信,使用弃用的Java桥时,此方法是正确的,但是我找不到使用JNI的任何示例或参考.

我的Java类看起来像这样:

package foo;

public class bar {

    public function dostuff() {

    }

}

我需要一次致电dostuff()作为应用程序流程的一部分.有人有什么想法吗?

谢谢,
J

推荐答案

由于javabridge已弃用,您将不得不使用JNI进行所有操作.在MacOS上,您需要将Javavm.Framework添加到您的项目中,从您的源文件中,您要寻找的标题为:

#import <JavaVM/jni.h>

接下来,您需要设置Javavm.这可能是不平凡的,具体取决于您的类路径和其他要求,但是您处于正确的轨道,因为这是您用于创建JVM的功能:

JNI_CreateJavaVM(JavaVM **pJVM, void **pJNIEnv, void *args);

接下来,您需要获取对foo.bar类的引用.您可以使用从JNI_Createjavm散发出来的PJNienv进行此操作.您需要致电:

jclass myClass = JNIEnv->FindClass(JNIEnv, "foo/bar"); // Note the slashes replacing the dots...

假设一切都正确设置,您将获得对课程的参考.假设foo.bar具有一个默认参数构造函数,您可以得到一个实例,例如:

jobject myFooBar = JNIEnv->NewObject(JNIEnv, myClass);

现在您需要获取Dostuff方法的方法.为此,您需要它的方法签名,您可以通过调用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...
}

如果您想要实际的投掷,则可以使用异常jni方法获得它.

因此,它最受欢迎的是:如何使用JNI从可可(Cocoa)调用Java方法.您将需要阅读JNI文档,尤其是有关了解全球和本地参考之间差异的部分. (即,使您的可可侧参考可以持续到足够长的时间,以至于在创建它们的范围之外都被称为.)实际上,有一章关于常见错误和陷阱,其中许多您会击中.

>

>

祝你好运!

以上所述是小编给大家介绍的使用JNI从可可拨打Java类功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25926.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。