如何通过JNI传递对象执行回调

网友投稿 842 2022-05-30

JNI的全称是java native interface,用来调用某些特定于系统平台或者硬件的操作,但是它只能调用c/c++的代码,若是其它语言代码,只能通过c/c++进行二次调用。

关于JNI的完整技术文档,大家可以查看下面这个网址:

http://java.sun.com/j2se/1.5.0/docs/guide/jni/

下面我们看下JNI如何执行回调函数:

我们知道在c/c++回调函数可以通过函数指针执行,但是在Java中已经没有指针的概念,在这里,我们先传递一个类对象给native函数,然后再dll中调用期望的函数即可。

下面的这个例子中,我们通过回调传递一个字符串给java,这在java和c/c++混合编程时传递dll内部的出错或其他信息到java层是很有用的。

1. 首先创建一个java类文件,封装一个native函数和一个用于回调的函数

package jni;

public class Log{

static{

System.loadLibrary("mylib");

}

//用来回调,输出c代码层的信息

public void output(String out){

System.out.println(out);

}

//native函数,用来传递Log对象,在jni中调用Log对象的output方法

public native void test(Log log);

public static void main(String[] args){

Log log = new Log();

log.test(log);

}

}

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class jni_Log */

#ifndef _Included_jni_Log

#define _Included_jni_Log

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: jni_Log

如何通过JNI传递对象执行回调

* Method: test

* Signature: (Ljni/Log;)V

*/

JNIEXPORT void JNICALL Java_jni_Log_test

(JNIEnv *, jobject, jobject);

#ifdef __cplusplus

}

#endif

#endif

#include

#include "jni_Log.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReasion,PVOID pvReserved)

{

return TRUE;

}

JNIEXPORT void JNICALL Java_jni_Log_test(JNIEnv * env, jobject obj, jobject log)

{

jclass cls = (*env)->GetObjectClass(env, log);//得到Log类

jmethodID jmid = (*env)->GetMethodID(env, cls, "output", "(Ljava/lang/String;)V");

jstring info = (*env)->NewStringUTF(env, "i am a error!");

(*env)->CallVoidMethod(env,log, jmid,info);

(*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env, info, FALSE));

}

C++ Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【MATLAB】数值运算 ( 数值运算示例 | 三角函数 | 指数运算 | 对数运算 | 常用的数学公式对应函数 )
下一篇:国人开发的纯JAVA三维可视化组件:Matplot3D for JAVA(V3.0) 类似 python的 matplotlib
相关文章