簡體   English   中英

使用jni從本機代碼調用Java方法

[英]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

JNI從c程序調用java方法

這些例子不能解決我的情況。 因為我的主程序是在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

如果沒有獲得要使用的類的對象,可以使用FindClassNewObject函數創建一個,如

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.

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