java之JNI使用说明
来源:互联网 发布:广告宣传语音制作软件 编辑:程序博客网 时间:2024/05/20 03:46
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/45441587
作者:小马
JAVA可以通过JNI接口访问本地的动态连接库(JAVA NATIVE INTERFACE),从而扩展JAVA的功能。我们知道JAVA有一个最大的有点就是它的平台无关性,但这个优点也导致了java访问底层设备的能力不足,而JNI正是弥补了这种不足。
下面通过一个完整的,简单的示例,来详细说明JNI的使用。
首先我们在eclipse下编写一个java的小程序,这个程序通过调用一个本地的方法输出字符串到命令行。
package com.mess;public class ShowMessage {private native void ShowMessage(String msg);static{System.loadLibrary("MsgImpl");}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubShowMessage appMessage = new ShowMessage();appMessage.ShowMessage("with jni");}}
static块确保类加载时就被调用,loadLibrary可以加载一个动态链接库到内存,这里我们随便给个名字叫MsgImpl。在windows下动态链接库的后缀是.dll, 而linux下是.so。
ShowMessage被声明为一个本地的私有方法,我们只在java中声明它,定义放在动态库实现中。另外要注意的一点是,loadLibrary加载时并没有用完整路径,只是给了库的名字,这就要求我们要把编译好的库放在java环境的路径下(我这里是C:\Java\jdk1.5.0_22\bin)
接下来是最重要的一步,生成动态库编译所用的头文件,我们使用javah命令,如下图:
注意上图中的路径,一定要在bin这一层目录,然后-jni后面指定包名在内的全路径。我试过直接到class文件所在目录会一直报错。
命令执行成功后,会生成名为com_mess_ShowMessage.h的文件,源码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_mess_ShowMessage */#ifndef _Included_com_mess_ShowMessage#define _Included_com_mess_ShowMessage#ifdef __cplusplusextern "C" {#endif/* * Class: com_mess_ShowMessage * Method: ShowMessage * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_mess_ShowMessage_ShowMessage (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif
最后,在vc下新建一个动态链接库工程,输出名为MsgImpl.dll的动态库,代码比较简单:
#include <jni.h>#include <stdio.h>#include "com_mess_ShowMessage.h"extern "C"JNIEXPORT void JNICALL Java_com_mess_ShowMessage_ShowMessage (JNIEnv *env, jobject, jstring jMsg){printf("first output");const char* msg = env->GetStringUTFChars(jMsg, 0);printf("thingking in:%s \n", msg);env->ReleaseStringUTFChars(jMsg, msg);}
把生成的动态库放到C:\Java\jdk1.5.0_22\bin目录下,在eclipse里运行java程序,输出:
0 0
- java之JNI使用说明
- JNI使用说明
- JAVA之JNI小结
- Java之JNI初步认识
- 【java学习】jni之JNIEnv*
- Java基础之JNI实现
- Java之_初识JNI
- Java之JNI参数传递
- Java再说JNI之实例
- Java之JNI原理介绍
- Java之JNI技术总结
- Java之JNI应用场景
- Java之JNI编程注意事项
- Java之详细介绍jNI
- Java语法基础之函数的使用说明
- Java语法基础之函数的使用说明
- android JNI学习之四 JNI java c对应关系
- Java与C++之JNI编程小结
- Eclipse常用设置
- C++ 静态数据成员 成员函数 静态变量 全局变量(2)
- android-APP长期运行于后台,重启后如何避免异常
- Android View 事件分发机制 源码解析 (上)
- 用PyOpenGL叩开3D的心扉——OpenGL全解析(4)
- java之JNI使用说明
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 字符串的排列
- Java协程框架-Kilim字节码剖析
- 压缩感知重构算法之分段正交匹配追踪(StOMP)
- 【机房重构】余额返还信息查询(DateTimePicker与DataGridView的使用)
- MooFest(POJ-1990)(树状数组)
- 学生信息管理系统错误汇总(一)
- iOS 数据持久化之plist