加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用jni从本机代码调用Java方法

发布时间:2020-12-15 04:24:58 所属栏目:Java 来源:网络整理
导读:我是JNI的新手.我成功编写了一些调用c语言编写的本机方法的程序. 现在我需要在初始化之后由本机代码端调用我的java代码.可能吗? 到现在为止,我尝试了某种轮询技术.也就是说,我定期检查我的java代码中的本机代码参数,但是如果本机代码可以发送某种中断的方式
我是JNI的新手.我成功编写了一些调用c语言编写的本机方法的程序.

现在我需要在初始化之后由本机代码端调用我的java代码.可能吗?
到现在为止,我尝试了某种轮询技术.也就是说,我定期检查我的java代码中的本机代码参数,但是如果本机代码可以发送某种中断的方式,那么它可能更有效.可能吗?或者你能建议一个比投票更好的方法吗?

注意:
?当我搜索“使用JNI从C调用Java函数”时,我得到的所有答案都是

http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI

JNI Call java method from c program

这些例子不能解决我的情况.因为我的主程序是在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,"callback_static","()V");

  // then call them.
  (*env)->CallVoidMethod      (env,foo_obj,mid_callback);
  (*env)->CallStaticVoidMethod(env,mid_callback_static);
}

你会得到输出

callback
static callback

如果没有获得要使用的类的对象,可以使用FindClass和NewObject函数创建一个,如

jclass    cls_foo  = (*env)->FindClass  (env,"foo");
jmethodID ctor_foo = (*env)->GetMethodID(env,"<init>","()V");
jobject   foo_obj  = (*env)->NewObject  (env,ctor_foo);

进一步阅读here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读