簡體   English   中英

使用JNI從Cocoa調用Java類函數

[英]Calling a Java class function from Cocoa with JNI

我真的很難弄清楚如何使用JNI從Objective-C調用Java函數。

我應該首先說我對Java知之甚少,但對Obj-C非常熟悉。 我有一個Java類,我需要從我的應用程序包中調用一個方法。 罐子是被捆綁的資源文件夾內,我有NSJavaRoot設置為Content/ResourcesNSJavaNeeded檢查和NSJavaPath包含2個jar文件(主要之一,一個依賴)的名字。

我正在使用對JNI_CreateJavaVM的調用來啟動VM,然后嘗試使用NSClassFromString查找類,這感覺不對,但這是我在搜索中找到的唯一方法。 我相信這個方法在使用已棄用的Java橋時是正確的,但我找不到任何使用JNI的示例或引用。

我的Java類看起來像這樣:

package foo;

public class bar {

    public function dostuff() {

    }

}

作為app流程的一部分,我需要調用dostuff()一次。 有沒有人有任何想法如何做到這一點?

謝謝,J

由於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
}

然后你可以用它來獲取你需要調用它的methodID。 像這樣:

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/

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM