[英]Calling a Java Method from the native code using jni
我是JNI的新手。 我成功編寫了一些調用c語言編寫的本機方法的程序。
現在我需要在初始化之后由本機代碼端調用我的java代碼。 可能嗎? 到現在為止,我嘗試了某種輪詢技術。 也就是說,我定期檢查我的java代碼中的本機代碼參數,但是如果本機代碼可以發送某種中斷的方式,那么它可能更有效。 可能嗎? 或者你能建議一個比投票更好的方法嗎?
注意:當我搜索“使用JNI從C調用Java函數”時,我得到的所有答案都是
http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI
這些例子不能解決我的情況。 因為我的主程序是在java中,我要問的是:我在java代碼中調用的本機函數(用c編寫)是否可以在某些情況下調用其他一些java函數? 是否可以在不使用上面提到的輪詢技術的情況下管理它?
當然。 它實際上比您鏈接的示例更容易,因為您不必生成JVM來執行它 - 調用您的java函數會為您提供指向您可以使用的環境的指針。 舉個簡單的例子:使用這樣的Java類:
public class foo {
static {
// load libfoo.so / foo.dll
System.loadLibrary("foo");
}
private native void nativecall();
public static void main(String[] args) {
foo f = new foo();
f.nativecall();
}
public void callback() {
System.out.println("callback");
}
public static void callback_static() {
System.out.println("static callback");
}
}
並且從C代碼編譯的庫如下:
#include <jni.h>
JNIEXPORT void JNICALL Java_foo_nativecall(JNIEnv *env, jobject foo_obj) {
// Get the class from the object we got passed in
jclass cls_foo = (*env)->GetObjectClass(env, foo_obj);
// get the method IDs from that class
jmethodID mid_callback = (*env)->GetMethodID (env, cls_foo, "callback" , "()V");
jmethodID mid_callback_static = (*env)->GetStaticMethodID(env, cls_foo, "callback_static", "()V");
// then call them.
(*env)->CallVoidMethod (env, foo_obj, mid_callback);
(*env)->CallStaticVoidMethod(env, cls_foo, mid_callback_static);
}
你會得到輸出
callback
static callback
如果沒有獲得要使用的類的對象,可以使用FindClass
和NewObject
函數創建一個,如
jclass cls_foo = (*env)->FindClass (env, "foo");
jmethodID ctor_foo = (*env)->GetMethodID(env, cls_foo, "<init>", "()V");
jobject foo_obj = (*env)->NewObject (env, cls_foo, ctor_foo);
進一步閱讀這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.