您的位置:首页 > 大数据 > 人工智能

JNI学习笔记(一)第一个JNI详细例子配图文http://blog.csdn.net/jiangqq781931404/article/details/7791183

2013-02-02 22:15 381 查看
这段时间在公司实习,因为项目要用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的代码了,但是让我们先打开头文件看看里面的实际内容:

[java]
view plaincopyprint?

/* 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
/* 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文件:编写如下

[java]
view plaincopyprint?

#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"); }

#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

[java]
view plaincopyprint?

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(); } }
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: