JAVA语言JNI的使用详解第一篇:HelloWorld
Vivian 2018-06-26 来源 : 阅读 731 评论 0

摘要:今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在JAVA语言中定义一个方法,在C++中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。希望对大家学习JAVA语言有所帮助。

今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在JAVA语言中定义一个方法,在C++中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。希望对大家学习JAVA语言有所帮助。分为以下步骤:

第一步:在Eclipse中建立一个类:JNIDemo

[java] view plain copy
1. package com.jni.demo;  
2. public class JNIDemo {  
3.     //定义一个本地方法  
4.     public native void sayHello();  
5.     public static void main(String[] args){  
6.         //调用动态链接库  
7.         System.loadLibrary("JNIDemo");  
8.         JNIDemo jniDemo = new JNIDemo();  
9.         jniDemo.sayHello();  
10.     }  
11. }

其中sayHello就是要在C++中实现的方法。

 

第二步:使用javah命令将JNIDemo生成.h的头文件:

命令如下:

E:\workspace\JNIDemo\bin>javah com.jni.demo.JNIDemo

注意:

1. 首先要确保配置了Java的环境变量的配置,不然javah命令不能用,具体怎么配置见://blog.csdn.net/jiangwei0910410003/article/details/17463173

2. 我的Java项目是放在E:\workspace中的,所以首先进入到工程的bin目录中,然后使用javah命令生成头文件

3. javah后面的类文件的格式:是类的全名(包名+class文件名),同时不能有.class后缀

命令执行成功后会在bin目录中生成头文件:com_jni_demo_JNIDemo.h

 JAVA语言JNI的使用详解第一篇:HelloWorld

但是我们还需要注意一个问题,就是如果我们的包含native方法的类,如果引用其他地方的类,那么这时候进入bin\classes\目录下会出现问题提示找不到指定的类,这时候我们需要切换到源码目录src下运行即可。

 

第三步:使用VC6.0生成.dll文件:

首先创建一个dll工程:

JAVA语言JNI的使用详解第一篇:HelloWorld

 JAVA语言JNI的使用详解第一篇:HelloWorld

JAVA语言JNI的使用详解第一篇:HelloWorld

在.cpp文件中输入如下代码:

[cpp] view plain copy
1. <span style="font-size:14px;">#include<iostream.h>  
2. #include "com_jni_demo_JNIDemo.h"  
3.   
4. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  
5. {  
6. cout<<"Hello World"<<endl;  
7. }</span>

 

说明:

1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}

这个方法的声明可以在上面生成的com_jni_demo_JNIDemo.h头文件中找到,这个就是Java工程中的sayHello方法的实现

2. 这里编译会出现几个问题:

(1):会提示你找不到相应的头文件:

 JAVA语言JNI的使用详解第一篇:HelloWorld

这时候需要将jni.h,jni_md.h文件考到工程目录中,这两个文件的具体位置在:

 JAVA语言JNI的使用详解第一篇:HelloWorld

java的安装目录中的include文件夹下,jni_md.h这个文件在win32文件夹中,找到这两个文件后,将其拷贝到C++的工程目录中;

(2) 当拷贝到这两个文件之后,编译还是提示找不到这两个文件:主要原因就是#include<jni.h>这个是从系统目录中查找jni.h头文件的,而我们只把jni.h拷贝到工程目录中,所以需要在com_jni_demo_JNIDemo.h头文件中将#include<jni.h>改成#include "jni.h",同理在jni.h文件中将#include<jni_md.h>改成#include "jni_md.h"

(3) 同时还有一个错误就是,提示:e:\c++\jnidemo\jnidemo.cpp(9) : fatal error C1010: unexpected end of file while looking for precompiled header directive,这个是预编译头文件读写错误,这时候还要在VC中进行设置:项目-》设置-》C/C++;在分类中选择预编译头文件,选择不使用预补偿页眉:

 JAVA语言JNI的使用详解第一篇:HelloWorld

这样,编译成功,生成JNIDemo.dll文件在C++工程中的Debug目录中

 

第四步:将JNIDemo.dll文件添加到path环境变量中:

 JAVA语言JNI的使用详解第一篇:HelloWorld

注意:在用户变量中的path设置,用分号隔开: ” ;E:\C++\Debug“,这样就将.dll文件添加到环境变量中了

 

第五步:在Eclipse中调用sayHello方法输出"Hello World":代码如下:

[java] view plain copy
1. public static void main(String[] args){  
2.     //调用动态链接库  
3.     System.loadLibrary("JNIDemo");  
4.     JNIDemo jniDemo = new JNIDemo();  
5.     jniDemo.sayHello();  
6. }

System.loadLibrary方法就是加载JNIDemo.dll文件的,一定要注意不要有.dll后缀名,只需要文件名即可;

注意:运行的时候会报错:

 JAVA语言JNI的使用详解第一篇:HelloWorld

这个提示就是没有找到JNIDemo.dll文件,这时候我们需要关闭Eclipse,然后在打开,运行就没有错了,原因是Eclipse每次打开的时候都会去读取环境变量的配置,我们刚才配置的path,没有立即生效,所以要关闭Eclipse,然后从新打开一次即可。

至此,一个简单的JNI例子到此演示完毕,后续还有更高级的应用,要及时关注呀!

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程