这段时间在公司实习,因为项目要用jni的东西,所以也在晚上花时间学习一下jni,首先了解一下jni;
JNI(Java Native Interface)是sun公司(当然现在已经归甲骨文了)定义的一套标准接口,如Dalvik,等等项目等Java虚拟机,都会实现JNI接口,共本地(C/C++)应用于Java VM相互调用。JNI: 可以供Java代码调用本地代码,本地代码也可以调用Java代码;
JNI是Java平台中的一个强大特性。应用程序可以通过JNI把C/C++代码集成进Java程序中。通过JNI,开发者在利用Java平台强大功能的同时,又不必放弃对原有代码的投资;因为JNI是Java平台定义的规范接口,当程序员向Java代码集成本地库时,只要在一个平台中解决了语言互操作问题,就可以把该解决方案比较容易的移植到其他Java平台中。
下面直接动手实现自己的第一个JNI应用,当然是我们学习编程语言那个输出神奇的HelloWorld!步骤如下:
其中的代码下载链接地址:http://download.csdn.net/detail/jiangqq781931404/4459102
(一):在eclipse中新建一个java项目(JNI_01),在类中创建native函数 public native void printf();
(二):在项目工程路径下面,使用javah命令,把该native方法编程C语言的头文件,使用方法如下:
此时会在bin目录下面生成一个.h文件(com_jiangqq_jni_TestJni.h),注意命名规则,和自己建立的包名和类名相关;现在我们就可以去建立自己的本地语言(C语言)的项目了,记得把这个头文件引入到本地语言项目中;
(三):建立本地语言项目(我使用C语言),使用VS2010开发工具,建立步骤如下:
新建项目-选择VisualC++项目-win32控制台应用程序(输入存储路径)确定,下一步-应用程序配置,勾选DLL,和空项目-完成;截图如下:
(四)把第二步得到com_jiangqq_jni_TestJni.h头文件放入到本地语言项目文件夹中,并且引入头文件(右击项目的头文件-添加-现有项-找到这个头文件),截图如下:
(五)此时可以开始编写输出HelloWorld的代码了,但是让我们先打开头文件看看里面的实际内容:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jiangqq_jni_TestJni */ #ifndef _Included_com_jiangqq_jni_TestJni #define _Included_com_jiangqq_jni_TestJni #ifdef __cplusplus extern "C" { #endif /* * Class: com_jiangqq_jni_TestJni * Method: printf * Signature: ()V */ JNIEXPORT void JNICALL Java_com_jiangqq_jni_TestJni_printf (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif然后再源文件夹中新建source.cpp文件:编写如下
#include"com_jiangqq_jni_TestJni.h" #include<stdio.h> JNIEXPORT void JNICALL Java_com_jiangqq_jni_TestJni_printf (JNIEnv * env, jobject obj) { printf("HelloWorld!\n"); }
此刻我们编译会发现VS中有如下的错误:
这是头文件中找不到jni.h头文件,看到这个错误不用着急,我们去JDK的安装目录- bin-include-jni.h 可以找到这个文件,只要把这个头文件放入到该项目中,然后引入,再把com_jiangqq_jni_TestJni.h中的头文件引入方式写成#include"jni.h"就好
可以再次编译,又发现VS报了如下的错误:
一看又是jni_md.h头文件的错误,在刚刚的jdk目录上面中点击,win32文件夹,发现里面就有jni_md.h头文件,同样方法引入进来:此刻再次编译,就不会报错了;
(六)运行程序,生成dll文件,运行成功在该项目中的Debug文件夹中
(七) 设置环境变量
把该dll所在的路径,配置到path路径中,然后再Java工程进行使用该dll
package com.jiangqq.jni; /** * 第一个JNI例子应用,使用本地语言(C语言)打印输出HelloWorld * @author jiangqq * <a href http://blog.csdn.net/jiangqq781931404>csdn 记录自己的成长历程</a> */ public class TestJni { public native void printf(); public static void main(String[] args) { System.loadLibrary("nativeCode"); new TestJni().printf(); } }
运行结果当然就是HelloWorld!啦,到此一个JNI输出HelloWorld的程序完成了
其中的代码下载链接地址:http://download.csdn.net/detail/jiangqq781931404/4459102