JAVA基础之理解JNI原理

标签: java 基础 理解 | 发表时间:2011-06-15 00:41 | 作者:宁 静 致 远 shuangxi
出处:http://www.cnblogs.com/

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:

实例:

环境说明:ubuntu 10.4.2 LTS系统

程序清单1:src/com/magc/jni/HelloWorld.java

1 /**
2 *
3 */
4  package com.magc.jni;
5
6 /**
7 * @author magc
8 *
9 */
10 public class HelloWorld {
11
12 static {
13
14 System.loadLibrary("Hello");
15
16 }
17
18 public native void DisplayHello();
19 /**
20 * @param args
21 */
22 public static void main(String[] args) {
23
24 new HelloWorld().DisplayHello();
25 }
26
27 }
 进入src目录下,编译该JAVA类,

命令:javac ./com/magc/jni/HelloWorld.java

在该HelloWorld.java所在目录下生成HelloWorld.class

然后使用javah生成头文件,

命令:javah -jni com.magc.jni.HelloWorld

在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数

程序清单2:com_magc_jni_HelloWorld.h

1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include <jni.h>
3 /* Header for class com_magc_jni_HelloWorld */
4
5 #ifndef _Included_com_magc_jni_HelloWorld
6 #define _Included_com_magc_jni_HelloWorld
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: com_magc_jni_HelloWorld
12 * Method: DisplayHello
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
16 (JNIEnv *, jobject);
17
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。

     2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。

 程序清单3:src/jni_helloworldImpl.cpp

#include <jni.h>
#include
"com_magc_jni_HelloWorld.h"
#include
<stdio.h>
JNIEXPORT
void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv
*env, jobject obj)
{
printf(
"From jni_helloworldImpl.cpp :");
printf(
"Hello world ! \n");
return;
}

此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。

编译生成动态库libHello.so,

命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so

成功后,便会在当前目录下生成动态链接库libHello.so文件。

有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法了,

命令:java -Djava.library.path=. com.magc.jni.HelloWorld

输入结果即为:From jni_helloworldImpl.cpp :Hello world !

作者: 宁 静 致 远 发表于 2011-06-15 00:41 原文链接

评论: 2 查看评论 发表评论


最新新闻:
· AMD召开首届Fusion开发者峰会:未来十年(2011-06-15 12:37)
· Google Chromebook第一印象:潮!(2011-06-15 12:08)
· 《愤怒的小鸟》下载超2.5亿次 将推新作(2011-06-15 12:06)
· SEC严打中国概念股再升级 高估值时代不复返(2011-06-15 12:04)
· IM工具或取代手机短信 两年内短信数量或降两成(2011-06-15 12:02)

编辑推荐:爱丽丝的发丝──《爱丽丝惊魂记:疯狂再临》制作点滴

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [java 基础 理解] 推荐:

Java基础—ClassLoader的理解

- - ZJD'S NOTES
} ``` 其余两个ClassLoader都是继承自`ClassLoader`这个类. Java的类加载采用了一种叫做“双亲委托”的方式(稍后解释),所以除了`Bootstarp ClassLoader`其余的ClassLoader都有一个“父”类加载器, 不是通过集成,而是一种包含的关系. ``` ##“双亲委托” 所谓“双亲委托”就是当加载一个类的时候会先委托给父类加载器去加载,当父类加载器无法加载的时候再尝试自己去加载,所以整个类的加载是“自上而下”的,如果都没有加载到则抛出`ClassNotFoundException`异常.

JAVA基础之理解JNI原理

- shuangxi - 博客园-首页原创精华区
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会. 有了JAVA标准平台的支持,使JNI模式更加易于实现和使用. 环境说明:ubuntu 10.4.2 LTS系统.

java基础知识

- - CSDN博客互联网推荐文章
JAVA相关基础知识. 1、面向对象的特征有哪些方面. 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象. 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.

JAVA面试精选【Java基础】

- - CSDN博客编程语言推荐文章
  这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱. 只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了. 对于那些正打算找工作JAVA软件开发工作的童鞋们来说,当你看到这份题目的时候,你应该感动很幸运,因为,只要你把题目中的内容都搞懂了,在笔试的时候就可以游刃有余,通过面试只有半步之遥了,笔试只能反映你的JAVA技能.

Java并发编程基础

- - 并发编程网 - ifeve.com
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力. 如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善. 现代的PC都有多个CPU或一个CPU中有多个核. 是否能合理运用多核的能力将成为一个大规模应用程序的关键. 进程是以独立于其他进程的方式运行的,进程间是互相隔离的.

JAVA操作Hbase基础例子

- - CSDN博客云计算推荐文章
        创建一张表.         写入一条数据.         写入一组数据.         //查询出一条数据.         删除一张表.         清空一张表.      * 写入一组数据.      * 获得一组Put.      * 组装一个Put.      * 查询出一条数据.

JAVA并发总结-基础篇

- - CSDN博客编程语言推荐文章
java中有几种方法可以实现一个线程. 继承Thread类,实现Runnable接口创建一个线程的唯一方法是实例化java.lang.Thread类(或其子类),并调用其start()方法. 调用ThreadInstanceA.inerrupt()方法,这样当A线程在Thread的sleep,join方法,或者Object的wait方法的时候会直接抛出InerruptedException,捕捉后便可退出.

Java代码审计基础(一)

- - 阿德马Web安全
本文重点是让大家了解JAVA代码审计的基础,会以漏洞示例的方式介绍JAVA代码中常见Web漏洞的形成和针对的修复方案,文章是在国外网站上看到的,因为在接触JAVA代码审计,感觉挺高大上的文章,很适合对JAVA代码审计感兴趣的童鞋找感觉之用,就根据自己的理解翻译了过来,拿去某平台投稿,被鄙视说太基础,就只好发自己的Blog上了.

JAVA 应用性能监控基础

- - Linux - 操作系统 - ITeye博客
       这里简单介绍了JAVA 应用程序部署linux 服务器上的一些常用监控信息,虽然现在很多自动化监控的东西,但是一些基本的东西,我们还是需要了解.        1.我习惯性先看看 CPU 和内存的使用情况,做一个简单的关注.           命令:top 可以关注运行状态.           命令:大写P:按CPU 使用排序,大写M:按内存使用排序,小写c:详细显示应用       .