详细介绍,初试JNI(Eclipse+VS2015 x64),以及错误分析

JNI简介

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

JNI的副作用

一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:
1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。

什么场合下应该使用JNI

当你开始着手准备一个使用JNI的项目时,请确认是否还有替代方案。应用程序使用JNI会带来一些副作用。下面给出几个方案,可以避免使用JNI的时候,达到与本地代码进行交互的效果:
1、JAVA程序和本地程序使用TCP/IP或者IPC进行交互。
2、当用JAVA程序连接本地数据库时,使用JDBC提供的API。
3、JAVA程序可以使用分布式对象技术,如JAVA IDL API。
这些方案的共同点是,JAVA和C处于不同的线程,或者不同的机器上。这样,当本地程序崩溃时,不会影响到JAVA程序。
下面这些场合中,同一进程内JNI的使用无法避免:
1、程序当中用到了JAVA API不提供的特殊系统环境才会有的特征。而跨进程操作又不现实。
2、你可能想访问一些己有的本地库,但又不想付出跨进程调用时的代价,如效率,内存,数据传递方面。
3、JAVA程序当中的一部分代码对效率要求非常高,如算法计算,图形渲染等。
总之,只有当你必须在同一进程中调用本地代码时,再使用JNI。

———————————————————以上内容来自百度百科—————————————————————

目的:

     通过学习JNI,进一步了解编译过程。

     参考c程序的执行过程Java代码编译和执行的整个过程

准备:

  • IDE准备

    Eclipse x64、JDKx64、vs2015。

    注释:Eclipse与JDK必须一致,也可以同为32位,对应生成32位的dll。

  • java环境变量设置(系统变量)

JAVA_HOME: jdk的安装目录


Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;


CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

 

操作:

step1:

编写一个Java文件(建立类的信息),使用命令javah将该文件编译成.h头文件。

1.MyJNI.java


public static void main(String[] he){
/*		System.loadLibrary("C++DLLtest");
		MyJNI m = new MyJNI();
		m.showThrone();*/
	}
}

2.javah生成.h文件



javah MyJNI



注释:javah也可对.java文件直接操作!本次应用,效果相同

3.修正

step2:

生成c++的dll文件

1.创建源文件

 

// C++DLLtest.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "jni.h" 
#include "C++DLLtest.h"
#include "MyJNI.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_MyJNI_showThrone(JNIEnv *env, jobject obj)
{
	cout << "good job,Throne!" << endl;
}



注释:函数定义请参考javah刚才生成的.h头文件中的函数声明

2.添加外部依赖项

将jni.h 与 jni_md.h 添加到C++源文件目录



添加后:

注意:将jni.h中引用jni_md.h改为 #include “jni_md.h” ,方便程序查询


3.生成.dll文件


 注释:若EclipseJDK都是32位的,则选择x86

 

4.移动生成的.dll文件到java项目下

 


     注释:①可以把生成的dll文件放在java项目根目录下;

                 ②也可以将生成的dll所在路径加入系统环境变量Path里(不过要重启Eclipse


                

                 ③当然也可以将该dll文件放在Java的安装目录下的

     

或者



5.完善java代码,运行观察结果

 

 

实验结果:

     java调用C++编译好的本地文件,实现对应功能。

                                                                                                                           ——     by Throne in SICAU,2017.3.20

——————————————————The End ——————————————————

欢迎大家指正,共同进步!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值