转自:   http://blog.csdn.net/jiangwei0910410003/article/details/17465085

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

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

  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命令不能用,具体怎么配置见:http://blog.csdn.net/jiangwei0910410003/article/details/17463173

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

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

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

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

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

首先创建一个dll工程:

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

  1. <span style="font-size:14px;">#include<iostream.h>
  2. #include "com_jni_demo_JNIDemo.h"
  3. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
  4. {
  5. cout<<"Hello World"<<endl;
  6. }</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):会提示你找不到相应的头文件:

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

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++;在分类中选择预编译头文件,选择不使用预补偿页眉:

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

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

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

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

  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后缀名,只需要文件名即可;

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

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

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

Java中JNI的使用详解第一篇:HelloWorld的更多相关文章

  1. Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...

  2. Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用

    转自: http://blog.csdn.net/jiangwei0910410003/article/details/17466369 上一篇说道JNIEnv中的方法的用法,这一篇我们就来通过例子来 ...

  3. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

  4. Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法

    首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject  NewObject(jclass clazz  , jmethodI ...

  5. Java中JNI的使用详解第五篇:C/C++中操作Java中的数组

    在Java中数组分为两种: 1.基本类型数组 2.对象类型(Object[])的数组(数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLength(ja ...

  6. python中的buildin函数详解(第一篇)

    这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...

  7. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  8. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  9. Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

随机推荐

  1. Oracle免客户端InstantClient安装使用

    正常情况下,用PL/SQL等软件连接Oracle,需要安装Oracle客户端软件,一般安装oracle客户端差不多需要2G左右的硬盘空间,但如果我们仅仅是连接数据库进行查询和执行一些相应的语句而不进行 ...

  2. Mysql生成索引的方式

    1.选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响.通常来说,可以遵循以下一些指导原则: (1)越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和C ...

  3. 给定一个十进制数,将其转化为N进制数-----17年滴滴笔试题

    题目:给定一个十进制数M,将其转化为N进制数,其中2<=N<=16,其中N为32为整型数; 输入:M N,如7 2 输出转化结果:111 注意点:考虑负数的情况,记得添加负号(其实直接添加 ...

  4. docker 入門

    http://dockone.io/article/277 我的碎碎念:Docker入门指南 [编者的话]之前曾经翻译过很多Docker入门介绍的文章,之所以再翻译这篇,是因为Anders的角度很独特 ...

  5. php获取微信用户信息(没测试过)

    <?php /** * 通过$appid.$appsecret获得基础支持的接口唯一凭证access_token,返回值为array类型 */ function get_access_token ...

  6. 使用sizemask来确保索引不越界

    [使用sizemask来确保索引不越界] 在redis的字典实现中,有一个sizemask字段. 此字段的作用是当使用下标访问数据时,确保下标不越界. 如当前size为8时,sizemask为7(0x ...

  7. centos 系统下彻底删除mysql

    yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mysql (删除数据库) rm /etc/my.cnf ...

  8. python OSError: [Errno 22] Invalid argument: 'D:\\crawle\x01.html1'

    import urllib.request file = urllib.request.open("http://www.baidu.com") data = file.read( ...

  9. 230. Kth Smallest Element in a BST 找到bst中的第k小的元素

    [抄题]: Given a binary search tree, write a function kthSmallest to find the kth smallest element in i ...

  10. [leetcode]416. Partition Equal Subset Sum分割数组的和相同子集

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...