网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Weblogic的结构特点.
.Java:默认变量初始化.
.适合于Cygwin的JVM(java虚拟机).
.JAVA基础知识(5).
.将文本格式的文章转换为html/xml.
.O/RMAPPING(Hibernate)方法小结.
.Java入门:状态对象--数据库的替.
.Java学习从入门到精通.书籍篇.
.Why I get Solaris Certificatio.
.使用Java访问网络资源.
.Taglib 原理和实现:第四章 循环的.
.Turbine HowTo 之 Service.
.用JDOM处理XML文档.
.Apple 更新 Java 到 v1.4.1.
.使用内部和匿名类优化Java代码.
.使用Forte for Java开发EJB(下).
.Acme包中的以Post方式发送数据的.
.SCJP认证套题解析(1).
.Java.NET --一个基于Java的Mic.
.JBoss 5迎来中间件彻底的可配置时.

使用JNI集成java与native程序

发表日期:2008-1-5


    JNI入门教程之HelloWorld篇一文中介绍了如何一步步编写JNI相关的应用程序,并没有更多的介绍相关的机制,本文主要介绍如何使用JNI把Java程序和native程序结合起来。

    当我们开始接触JNI但是还不熟悉的时候,也许会这样几个问题:

  1. Java程序和native程序的数据类型通常是不一样的,它们怎么相互映射的呢?
  2. 怎么在native方法中访问java方法传递过来的数据呢?
  3. 在native方法中可以创建java对象吗?
  4. 如何把结果返回给调用它的java方法?

    读完本文你将会明白如上问题的来龙去脉。首先我在重复一下如何编写JNI相关的应用程序,我们必须在java方法中声明一个native的方法,比如public native String getLine(String prompt);这个方法具有的两个特点是,引入了要害字native,它的意思是这个方法的实现由其他的语言实现,比如c/c++等。另外这个方法是以分号结尾的,表明这个方法不包括实现。我们在上篇文章已经知道使用javah命令可以得到我们需要的header文件。下面给出java程序和相关的.h文件的代码

//Prompt.java
class Prompt {
  private native String getLine(String prompt);
  public static void main(String args[]) {
    Prompt p = new Prompt();
    String input = p.getLine("Type a line: ");
    System.out.println("User typed: " + input);
  }
  static {
    System.loadLibrary("prompt");
  }
}

//Prompt.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Prompt */

#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Prompt
 * Method:    getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Prompt_getLine
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

    我们可以看到在Prompt.h文件中定义了我们要实现的函数的原型,我们主要关心两点一个是方法名称另一个是方法的参数,方法的名称为Java_Prompt_getLine,它是由如下四部分组成
使用JNI集成java与native程序(图一)

 

 

 

 

看看方法的参数,由三个参数组成分别是JNIEnv *, jobject, jstring。JNIEnv是一个JNI接口指针,它事实上是由函数表组成的,我们可以使用JNIEnv来访问java对象。jobject是当前类的的引用,想当与java中的this。最后一个参数是jstring,代表了我们java方法中的String prompt。

    在编写native方法的时候,无论是java基本类型还是对象我们都不能在c/c++中直接使用,必须要转成相对应得类型,下面给出基本数据类型的对应关系。

Java Type Native Type Size in bits boolean jboolean 8, unsigned byte jbyte 8 char jchar 16, unsigned short jshort 16 int jint 32 long jlong 64 float jfloat 32 double jdouble 64 void void n/a


上一篇:JNI入门教程之HelloWorld篇 人气:1616
下一篇:bug? Hbm2JavaTask无法实现joined-subclass单独配置文件(2.1.2) 人气:838
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐