手把手教你通过Eclipse工程配置调用JNI完全攻略_第1页
手把手教你通过Eclipse工程配置调用JNI完全攻略_第2页
手把手教你通过Eclipse工程配置调用JNI完全攻略_第3页
手把手教你通过Eclipse工程配置调用JNI完全攻略_第4页
手把手教你通过Eclipse工程配置调用JNI完全攻略_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了。百度出来的JNI调用方法,前三页几乎毫不例外的都是几年前的资料,告诉你如何设立一大堆莫名其妙的参数、如何通过命令行加工出dll并调用出来的,遗憾的是笔主打开的那堆帖子,多少都有些操作上的出入,再一个笔主对嘿嘿的命令行窗口无爱,并且,例外的帖子笔主还木有幸看到...所以笔主狠心放下公司工作,抛弃领导的绩效奖金,花了大半天时间研究JNI的调用方法(特别不用写命令那种),终于赶在下班的前三分钟,顺利完全通过eclipse界面调用出自定义的dll方法!那个激动就像中美建交或日本淹没或苍老师来我家做客那一瞬间那么振奋人心!!

简朴准备工作:以下具体操作方法可以直接百度,答案几乎是唯一可信的。安装JDK,配置系统环境变量准备好一个带CDT插件的Eclipse,笔主使用的是google的ADTBundle,自带了CDT,相应Eclipse3.8.0版下载一个MinGW(免费的C/C++等语言编译器套件),笔主限于公司垃圾网络,测试时使用mingw-offline-install-20230426v4.6.2版,安装时仅需勾选(在线安装版下载数据量约50Mb):CCompilerC++CompilerMinGWDeveloperToolkit(IndudesMSYSBasicSystem)

配置MinGW的环境变量:打开环境变量(系统变量),添加MINGW_HOME变量,变量值是刚才MinGW的安装地址,如D:\ProgramFiles\MinGW设立path变量,编辑path变量添加%MINGW_HOME%\bin;%MINGW_HOME%\msys\1.0\bin;添加LIBRARY_PATH变量,变量值%MINGW_HOME%\lib添加C_INCLUDE_PATH变量,变量值%JAVA_HOME%\include;%JAVA_HOME%\include\win32;%MINGW_HOME%\include添加CPLUS_INCLUDE_PATH变量,内容%JAVA_HOME%\include;%JAVA_HOME%\include\win32;%MINGW_HOME%\lib\gcc\mingw32\4.5.2\include\c++Win7点击拟定后立即生效,若未生效请重启系统(参考安装JDK时配置操作)第4、5步额外添加的%JAVA_HOME%\include;%JAVA_HOME%\include\win32;是为了让eclipse在c/c++项目中自动引入这个目录下的各种头文献,例如jni.h,也可在具体项目的属性中以下位置进行指定:

调用JNI全过程:创建一个普通java工程Test,添加一个专门负责引入调用本地库的类Native,代码如下:1publicclassNative{2//声明自定义本地库方法接口3nativepublicstaticvoidrun();42.com5//自动加载本地库文献,如文献名全称为myCLib.dll6static{7System.loadLibrary("myCLib");8}9}

打开CMD....好吧,笔主认可标题党了,整个博文仅此一处需要一句简朴的命令!CMD导航至项目文献夹下的src目录,输入javahtest.Native(需要使用包名.类名的完整限定名称),生成本地方法接口头文献test_Native.h:

刷新eclipse的PackageExplorer应当会变成这样的目录状态,其中刚才刚才生成的test_Native.h文献代码如下图示(笔主抢闸创建了Test类,稍候用于调用Native类的本地方法):

创建一个新的C工程MyC,期待编译成dll的时候,选择SharedLibrary下的模板:

在MyC工程内创建一个文献夹src,并将刚才Test项目中生成的test_Native.h头文献拷贝(或剪切)到

MyC

工程的src文献夹下,,Test工程下的

test_Native.h文献在后面的项目运营过程中将不再起任何作用,可删:

*

打开MyC工程下的

test_Native.h,若#include<jni.h>提醒Unresolvedinclusion:<jni.h>的错误警告(如下图所示),则表白目前这个C项目没有指定jni.h的头文献位置,参考上文配置MinGW的环境变量的第4、5步进行配置:

**

MyC工程文献中接口函数代码上提醒的Syntaxerror可以暂时忽略,据闻是eclipse语法检测的一个bug:

在MyC工程src文献夹中,新建一个C的实现类NativeC.c,引入接口头文献jni.h、test_Native.h,并编写接口函数JNICALLJava_test_Native_run的实现(函数接口直接从test_Native.h中完整拷贝过来,注意加上形参):1#include<jni.h>2#include"test_Native.h"3#include<stdio.h>45JNIEXPORTvoidJNICALLJava_test_Native_run6(JNIEnv*env,jclassclazz){7puts("HelloJAVA,IamC.");8}

此时工程看起来应当是这样子的:

由于使用minGW默认生成的dll函数署名带有@分隔符,将导致后面JNI调用时产生java.lang.UnsatisfiedLinkError:xoxoclass.xoxomethod()错误,因此需要执行以下环节消除多余的@符号。配置MyC工程:

MyC

工程上右键菜单Properties,左侧选择C/C++Build->Settings,右侧Configuration中显示的为当前正在显示的编译模板,[Active]表达通过Project->BuildProject菜单编译时使用的默认编译版本,minGW将根据这些模板的属性设立,编译生成多套版本的dll或exe,有洁癖的同学可通过最右侧的ManageConfigurations...按钮增删编译模板:

为了对比效果,笔主决定增长一套新模板ReleaseNoAt,继承默认的Release模板属性参数,并设立为Active,决不是由于洁癖或什么奇怪的因素:

OK返回刚才的编译模板属性配置界面,在ReleaseNoAt模板下,ToolSettins页中的MinGWCLinker->Miscellaneous,Linkerflags框中输入-Wl,--kill-at,点击最下方的Apply:

点击MinGWCLinker,显示的参数结果应当是这样的:

假如之前建立的C工程不是使用

SharedLibrary模板,并且默认编译出的不是dll文献,可以在此选择BuildArtifact页进行修改配置,ArtifactType中选择SharedLibrary,Artifactextension中选择dll即可,Outputprefix可指定输出dll文献的命名前缀:

OK拟定返回代码编辑界面,在MyC工程上右键菜单,BuildConfigurations->BuildAll,生成所有模板的dll文献版本:

各版本dll如下图所示,控制台中可以见到每个dll生成所用的命令参数(现在显示的是ReleaseNoAt版本,即唯一配置了去掉@符号的模板):

为了验证默认Release与ReleaseNoAt版本的区别,可用dllexp这个工具打开这两个dll文献进行查看(具体方法不告诉你):Release版(下面这个@8就是一切麻烦的罪魁祸首)

ReleaseNoAt版(干净了)

回到eclipse,在Test工程中新建文献夹dll(命名随意),并将上面生成的ReleaseNoAt版libMyC.dll拷贝到这个dll文献夹中,重命名为myCLib.dll(由于上文Native类中通过System.loadLibrary("myCLib");加载了这个名字的dll文献,当然你也可以修改代码变成System.loadLibrary("libMyC");来取代重命名),此后

MyC工程将不再起任何作用,可删:

配置Test工程属性,指定工程的本地库目录,直接看图:

Test工程test包中新建Test类(由于时间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论