文档章节

java中的JNI调用其他开与语言的程序

Z
 Zoe_2016
发布于 2016/11/17 10:45
字数 1033
阅读 5
收藏 0

这里是C++的实现输出“HelloWorld”的方法,然后回到Java中进行调用。

步骤

(1)在Eclipse中建立一个类:JNIDemo

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

(2)使用javah命令将JNIDemo生成.h的头文件:

命令如下:

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

注意

1. 确保配置了Java的环境变量:

http://blog.csdn.net/jiangwei0910410003/article/details/17463173

(内容:ClASSPATH中输入: ".;C:\Program Files\Java\jdk1.7.0_07\jre\lib\rt.jar;"//java的安装目录,特别要注意有点号和分号PATH中输入:"C:\Program Files\Java\jdk1.7.0_07\bin;" )

2. 进入到工程的bin目录中,然后使用javah命令生成头文件

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

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

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

(3)使用VC6.0生成.dll文件:

首先创建一个dll工程:

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

  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):会提示你找不到相应的头文件:

这时候需要将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例子到此演示完毕,后续还有更高级的应用,要及时关注呀!

 

 

附【来自网友ETH0:

http://www.newsmth.net/nForum/#!article/DOC/14371】:

有一些jni 的wrapper,不是用java来实现,只是封装了native
的mpi库。
  
1.mpiJava
http://aspen.ucs.indiana.edu/pss/HPJava/mpiJava.html
  
2.Java MPI Wrapper
http://www.npac.syr.edu/users/yjchang/javaMPI/
http://www.npac.syr.edu/users/yjchang/mpi/mpi.html
  
3.JPVM
http://www.cs.virginia.edu/~ajf2j/jpvm.html

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

Z
粉丝 0
博文 36
码字总数 12725
作品 0
广州
私信 提问
native关键字初识--java调用非java代码的接口

Java基础知识——JNI入门介绍(上) Java™ 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成。如果您希望利用已有的代...

成长中的菜鸟
2015/02/10
282
0
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

长平狐
2013/01/06
126
0
JNI 技术与 Android 应用

1. 什么是 JNI JNI是Java Native Interface的缩写。从Java 1.1开始,JNI标准成为java平台的一部分,它允许Java和其他语言进行交互。JNI一开始为C和C++而设计的,但是它并不妨碍你使用其他语言...

鉴客
2010/09/12
2.3K
1
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

鉴客
2012/03/09
227
0
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

晨曦之光
2012/03/01
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
27分钟前
4
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
39分钟前
3
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
42分钟前
3
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
46分钟前
2
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
51分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部