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

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

 

JNI的全称是java native interface,用来调用某些特定于系统平台或者硬件的操作,但是它只能调用c/c++的代码,若是其它语言代码,只能通过c/c++进行二次调用。
关于JNI的完整技术文档,大家可以查看下面这个网址:
 
下面我们看下JNI如何执行回调函数:
我们知道在c/c++回调函数可以通过函数指针执行,但是在Java中已经没有指针的概念,在这里,我们先传递一个类对象给native函数,然后再dll中调用期望的函数即可。
下面的这个例子中,我们通过回调传递一个字符串给java,这在java和c/c++混合编程时传递dll内部的出错或其他信息到java层是很有用的。
1.
  首先创建一个java类文件,封装一个native函数和一个用于回调的函数
如何通过JNI传递对象执行回调
package
 jni;
如何通过JNI传递对象执行回调
如何通过JNI传递对象执行回调

public
 
class
 Log

{

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

如何通过JNI传递对象执行回调              System.loadLibrary(
mylib);
如何通过JNI传递对象执行回调    }

如何通过JNI传递对象执行回调    
如何通过JNI传递对象执行回调        
//用来回调,输出c代码层的信息
如何通过JNI传递对象执行回调
    public void output(String out){

如何通过JNI传递对象执行回调               System.out.println(out);
如何通过JNI传递对象执行回调    }

如何通过JNI传递对象执行回调    
如何通过JNI传递对象执行回调        
//native函数,用来传递对象
如何通过JNI传递对象执行回调
       public native void test(Log log);
如何通过JNI传递对象执行回调    
如何通过JNI传递对象执行回调    
public static void main(String[] args){

如何通过JNI传递对象执行回调        Log log 
= new Log();
如何通过JNI传递对象执行回调        
如何通过JNI传递对象执行回调        log.test(log);    
如何通过JNI传递对象执行回调    }

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

2.
  调用javah命令,生成对应的c/c++都文件
如何通过JNI传递对象执行回调


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

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

<
jni.h
>

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


/* Header for class jni_Log */

如何通过JNI传递对象执行回调
如何通过JNI传递对象执行回调#ifndef _Included_jni_Log
如何通过JNI传递对象执行回调#define _Included_jni_Log
如何通过JNI传递对象执行回调#ifdef __cplusplus
如何通过JNI传递对象执行回调extern 


C

 

{

如何通过JNI传递对象执行回调#endif
如何通过JNI传递对象执行回调
/*
如何通过JNI传递对象执行回调 * Class:     jni_Log
如何通过JNI传递对象执行回调 * Method:    test
如何通过JNI传递对象执行回调 * Signature: (Ljni/Log;)V
如何通过JNI传递对象执行回调 
*/

如何通过JNI传递对象执行回调JNIEXPORT 
void JNICALL Java_jni_Log_test
如何通过JNI传递对象执行回调  (JNIEnv 
*, jobject, jobject);
如何通过JNI传递对象执行回调
如何通过JNI传递对象执行回调#ifdef __cplusplus
如何通过JNI传递对象执行回调}


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

3.
  利用vc和生成的头文件完成一个dll
   
如何通过JNI传递对象执行回调   
#include 
<
windows.h
>

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


jni_Log.h


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

int
 WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReasion,PVOID pvReserved)
如何通过JNI传递对象执行回调


{

如何通过JNI传递对象执行回调    
return TRUE;
如何通过JNI传递对象执行回调}


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

void
 JNICALL Java_jni_Log_test(JNIEnv 
*
 env, jobject obj, jobject log)
如何通过JNI传递对象执行回调


{

如何通过JNI传递对象执行回调    jclass cls 
= (*env)->GetObjectClass(env, log);
如何通过JNI传递对象执行回调    jmethodID jmid 
= (*env)->GetMethodID(env, cls, output(Ljava/lang/String;)V);
如何通过JNI传递对象执行回调    jstring info 
= (*env)->NewStringUTF(env, i am a error!);
如何通过JNI传递对象执行回调    (
*env)->CallVoidMethod(env,log, jmid,info);
如何通过JNI传递对象执行回调    (
*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env, info, FALSE));
如何通过JNI传递对象执行回调}


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

                 编译完成后,将mylib.dll放到与jni同级的目录中,运行命令java jni.Log,即可看到控制台成功打印信息

                i am a error!“。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100529.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《前端运维》一、Linux基础–01基础命令与vim

    在开始之前,你需要做一些准备工作,去阿里买一台服务器,服务器的具体细节其实并不是十分重要,我也不会在这里一步一步的教大家如何去买一个服务器。百度一下足够了,但是还是要贴一下这系列文章中,我所使用的服务

    2022年3月25日
    36
  • 求二叉树的最长路径_对下列二叉树进行前序遍历的结果为

    求二叉树的最长路径_对下列二叉树进行前序遍历的结果为Ural 大学有 N 名职员,编号为 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数 N。接下来 N 行,第 i 行表示 i 号职员的快乐指数 Hi。接下来 N−1 行,每行输入一对整数 L,K,表示 K 是 L 的直接

    2022年8月9日
    7
  • 自定义的delay函数

    自定义的delay函数 #include#include voidwait(intm_seconds){   clock_tendwait;   endwait=clock()+m_seconds;   while(clock()} //VC下clock_t应为doubleintmain(void){  clock_t

    2022年6月2日
    33
  • 个人整理的一些net 开源项目

    个人整理的一些net 开源项目net开源商城:BrnMall地址 http://www.brnshop.com/ 技术架构很不错;官方提供技术支持,有博客有视频介绍;官方技术博客:http://www.cnblogs.com/wheretime/官方视频下载地址:http://pan.baidu.com/s/1dDCKQXj真乃业界良心之作;风格和天猫京东各大商城接近;后台都很好;

    2022年7月15日
    13
  • Effective C++:条款28:避免返回 handles 指向对象内部成员

    Effective C++:条款28:避免返回 handles 指向对象内部成员

    2021年12月16日
    97
  • Nginx实现动静分离「建议收藏」

    Nginx实现动静分离「建议收藏」前言之前项目中需要用到百度地图,由于项目的特殊环境,所以需要下载百度的离线地图。我们知道,地图的展示其实就是一张张地图的图片展示,我们在网页上浏览查找位置的时候,其实都是在发送图片请求。这些图片请求相对于jsp,servlet来说就是所谓的静态资源,当然服务中的静态资源不仅仅只是图片,像页面样式css文件,js脚本文件这些都可以看着是静态资源。tomcat既可以静态资源也可以处理动态资源。但是…

    2022年4月28日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号