|   登录   |   注册   |   设为首页   |   加入收藏   

用户登录

close

用户名:

密码:

新用户注册

close

用户名:

密码:

密码确认:

电子邮箱:

关注内容:

个人主页:

帮助

close

龙宇网成立于2008年3月,网站进入整体运作于2010年10月1日。

在这里,我们把它做成了一个真正意义上的网站,完全以个人的信息为内容,以网友的需要为主导,全力搜罗各种信息,建立完善的网站功能,使网友在这里可以第一时间找到所需要的信息。

现在,经过三年的努力,网站的资料已经相当丰富,而网站得到了大家的喜爱和认可。

但,我们还是会继续努力下去,让网间的这份快乐继续持续下去,让这份闲暇时的日子,与快乐一并同行。

寻觅快乐,网住快乐,关注网络,是龙宇网的宣言与承诺。

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

分类: 移动开发 发布时间: 2012-09-04 23:30:38 浏览次数: 5405
内容提要: JNI的全称是java native interface,用来调用某些特定于系统平台或者硬件的操作,但是它只能调用c/c++的代码,若是其它语言代码,只能通过c/c++进行二次调用。

JNI的全称是java native interface,用来调用某些特定于系统平台或者硬件的操作,但是它只能调用c/c++的代码,若是其它语言代码,只能通过c/c++进行二次调用。
关于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函数,用来传递对象
public native void test(Log log);

public static void main(String[] args){
Log log
= new Log();

log.test(log);
}

}
2. 调用javah命令,生成对应的c/c++都文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_Log */

#ifndef _Included_jni_Log
#define _Included_jni_Log
#ifdef __cplusplus
extern
"C" {
#endif
/*
* Class: jni_Log
* Method: test
* Signature: (Ljni/Log;)V
*/

JNIEXPORT void JNICALL Java_jni_Log_test
(JNIEnv
*, jobject, jobject);

#ifdef __cplusplus
}

#endif
#endif
3. 利用vc和生成的头文件完成一个dll
#include <windows.h>

#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);
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));
}

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

"i am a error!"。

 

 

test ok

10
1

分类: 移动开发   |   评论: 0   |   引用: 0   |   浏览次数: 5405