JAVA JNI原理
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:
实例:
环境说明:ubuntu 10.4.2 LTS系统
程序清单1:src/com/magc/jni/HelloWorld.java
/** * */ package com.magc.jni; /** * @author magc * */ public class HelloWorld { static { System.loadLibrary("Hello"); } public native void DisplayHello(); /** * @param args */ public static void main(String[] args) { new HelloWorld().DisplayHello(); } }
进入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
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_magc_jni_HelloWorld */ #ifndef _Included_com_magc_jni_HelloWorld #define _Included_com_magc_jni_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: com_magc_jni_HelloWorld * Method: DisplayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #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 !
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍java BASE64Encoder详细介绍及简单实例,包括了java BASE64Encoder详细介绍及简单实例的使用技巧和注意事项,需要的朋友参考一下 java BASE64Encoder详解 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。 Base64要
本文向大家介绍Python pass详细介绍及实例代码,包括了Python pass详细介绍及实例代码的使用技巧和注意事项,需要的朋友参考一下 Python pass的用法: 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/Java中: 对应于Python就要这样写: 1 pass语句在函数中的作用 当你在编写一个程序时,执行语句部分思路还没有完成,这时你可
本文向大家介绍Android Loader详细介绍及实例代码,包括了Android Loader详细介绍及实例代码的使用技巧和注意事项,需要的朋友参考一下 一,Android装载器基本方法 装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性: 它们对每个Activity和Fragment都有效。 他们提供了异步加载数据的能力。
本文向大家介绍HTTPS 通信原理及详细介绍,包括了HTTPS 通信原理及详细介绍的使用技巧和注意事项,需要的朋友参考一下 HTTPS 通信原理 Https是基于安全目的的Http通道,其安全基础由SSL层来保证。最初由netscape公司研发,主要提供了通讯双方的身份认证和加密通信方法。现在广泛应用于互联网上安全敏感通讯。 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行
本文向大家介绍SQL JOIN 连接详细介绍及简单使用实例,包括了SQL JOIN 连接详细介绍及简单使用实例的使用技巧和注意事项,需要的朋友参考一下 SQL JOIN 连接 SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN
本文向大家介绍Android PopupWindow全屏详细介绍及实例代码,包括了Android PopupWindow全屏详细介绍及实例代码的使用技巧和注意事项,需要的朋友参考一下 Android PopupWindow全屏 很多应用中经常可以看到弹出这种PopupWindow的效果,做了一个小demo分享一下。demo的思路是通过遍历文件,找到图片以及图片文件夹放置在PopupWindow上
本文向大家介绍java 线程同步详细介绍及实例代码,包括了java 线程同步详细介绍及实例代码的使用技巧和注意事项,需要的朋友参考一下 java 线程同步 概要: 为了加快代码的运行速度,我们采用了多线程的方法。并行的执行确实让代码变得更加高效,但随之而来的问题是,有很多个线程在程序中同时运行,如果它们同时的去修改一个对象,很可能会造成讹误的情况,这个时候我们需要用一种同步的机制来管理这些线程。
本文向大家介绍php 单例模式详细介绍及实现源码,包括了php 单例模式详细介绍及实现源码的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了PHP中数据库单例模式的实现代码分享,本文先是讲解了单例模式的一些知识,然后给出了数据库单例模式实现代码。 什么是单例模式 单例模式顾名思义,就是只有一个实例。 作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提