簡體   English   中英

是否可以使用JNI在C或C ++中實現Java接口?

[英]Is it possible to implement a Java Interface in C or C++ using JNI?

假設一個包含類的Java庫,我們稱之為Foo 該類包含一個構造函數和兩個方法:

// constructor
Foo();

// returns a random int
public int bar();

// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);

這假定Java接口IntGeneratorListenerInterface有一個方法:

void integerGenerated(int generatedInt);

我可以從本地C和C ++調用bar() 這是一個C ++示例,假設正確初始化JNIEnv env

// instantiate Foo
jclass fooClass = env->FindClass("com/my/package/Foo");
jmethodID constructorMethodID = env->GetMethodID(fooClass, "<init>", "()V");
jobject fooInstance = env->NewObject(fooClass, constructorMethodID);

// call bar()
jmethodID barMethodID = env->GetMethodID(fooClass, "bar", "()I");
jint result = env->CallIntMethod(fooInstance, barMethodID);
printf("%d", result);

我想要做的是從C / C ++實現接口IntGeneratorInterface ,這樣當我使用類似的JNI調用調用generateInt() ,我可以在C中接收回調,如:

void integerGenerated(int x)
{
    // do something with the int
}

我的問題:有沒有辦法在C / C ++中實現Java接口,這樣我可以將有效的東西傳遞給generateInt() ,並在C中調用integerGenerated()

我查看了JNI的RegisterNatives() ,但我相信這需要Java代碼聲明並調用“本機”方法(如果我錯了請糾正我),而且我沒有修改現有Java的奢侈圖書館。 另請注意,這里使用簡單的Java庫來舉例說明我的問題。 我意識到這樣簡單的功能可以像原生一樣輕松編寫。

是。 就像使用任何其他本機方法一樣:

class NativeRunnable implements Runnable {
    @Override
    public native void run();
}

現在只需使用javah創建頭文件並實現該功能。

暫無
暫無

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

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