收藏 分销(赏)

手把手教你通过Eclipse工程配置调用JNI完全攻略.doc

上传人:人****来 文档编号:4186058 上传时间:2024-08-13 格式:DOC 页数:21 大小:900.04KB 下载积分:10 金币
下载 相关 举报
手把手教你通过Eclipse工程配置调用JNI完全攻略.doc_第1页
第1页 / 共21页
手把手教你通过Eclipse工程配置调用JNI完全攻略.doc_第2页
第2页 / 共21页


点击查看更多>>
资源描述
当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了。 百度出来的JNI调用方法,前三页几乎毫不例外的都是几年前的资料,告诉你如何设立一大堆莫名其妙的参数、如何通过命令行加工出dll并调用出来的,遗憾的是笔主打开的那堆帖子,多少都有些操作上的出入,再一个笔主对嘿嘿的命令行窗口无爱,并且,例外的帖子笔主还木有幸看到... 所以笔主狠心放下公司工作,抛弃领导的绩效奖金,花了大半天时间研究JNI的调用方法(特别不用写命令那种),终于赶在下班的前三分钟,顺利完全通过eclipse界面调用出自定义的dll方法!那个激动就像中美建交或日本淹没或苍老师来我家做客那一瞬间那么振奋人心!!   简朴准备工作: 以下具体操作方法可以直接百度,答案几乎是唯一可信的。 1. 安装JDK,配置系统环境变量 2. 准备好一个带CDT插件的Eclipse,笔主使用的是google的ADT Bundle,自带了CDT,相应Eclipse 3.8.0版 3. 下载一个MinGW(免费的C/C++等语言编译器套件),笔主限于公司垃圾网络,测试时使用mingw-offline-install-20230426 v4.6.2版,安装时仅需勾选(在线安装版下载数据量约50Mb): · C Compiler · C++ Compiler · MinGW Developer Toolkit (Indudes MSYS Basic System)   配置MinGW的环境变量: 1. 打开环境变量(系统变量),添加 MINGW_HOME 变量,变量值是刚才MinGW的安装地址,如 D:\Program Files\MinGW 2. 设立path变量,编辑path变量添加 %MINGW_HOME%\bin;%MINGW_HOME%\msys\1.0\bin; 3. 添加 LIBRARY_PATH 变量,变量值 %MINGW_HOME%\lib 4. 添加 C_INCLUDE_PATH 变量,变量值 %JAVA_HOME%\include;%JAVA_HOME%\include\win32;%MINGW_HOME%\include 5. 添加 CPLUS_INCLUDE_PATH 变量,内容 %JAVA_HOME%\include;%JAVA_HOME%\include\win32;%MINGW_HOME%\lib\gcc\mingw32\4.5.2\include\c++ 6. Win7点击拟定后立即生效,若未生效请重启系统(参考安装JDK时配置操作) 第4、5步额外添加的%JAVA_HOME%\include;%JAVA_HOME%\include\win32;是为了让eclipse在c/c++项目中自动引入这个目录下的各种头文献,例如 jni.h,也可在具体项目的属性中以下位置进行指定:     调用JNI全过程: 创建一个普通java工程 Test,添加一个专门负责引入调用本地库的类 Native,代码如下: 1 public class Native { 2 // 声明自定义本地库方法接口 3 native public static void run(); 4 5 // 自动加载本地库文献,如文献名全称为 myCLib.dll 6 static{ 7 System.loadLibrary("myCLib"); 8 } 9 }   打开CMD....好吧,笔主认可标题党了,整个博文仅此一处需要一句简朴的命令! CMD导航至项目文献夹下的 src 目录,输入 javah test.Native(需要使用包名.类名的完整限定名称),生成本地方法接口头文献 test_Native.h:   刷新eclipse的 Package Explorer 应当会变成这样的目录状态,其中刚才刚才生成的 test_Native.h 文献代码如下图示(笔主抢闸创建了Test类,稍候用于调用Native类的本地方法):     创建一个新的 C 工程 MyC,期待编译成dll的时候,选择 Shared Library 下的模板:    在 MyC 工程内创建一个文献夹 src ,并将刚才 Test 项目中生成的 test_Native.h 头文献拷贝(或剪切)到 MyC 工程的 src 文献夹下,,Test 工程下的 test_Native.h 文献在后面的项目运营过程中将不再起任何作用,可删:   *  打开 MyC 工程下的 test_Native.h ,若 #include <jni.h> 提醒 Unresolved inclusion: <jni.h> 的错误警告(如下图所示),则表白目前这个C项目没有指定 jni.h 的头文献位置,参考上文 配置MinGW的环境变量 的第4、5步进行配置:    **  MyC 工程文献中接口函数代码上提醒的 Syntax error 可以暂时忽略,据闻是eclipse语法检测的一个bug:      在 MyC 工程 src 文献夹中,新建一个C的实现类 NativeC.c ,引入接口头文献 jni.h、test_Native.h ,并编写接口函数 JNICALL Java_test_Native_run 的实现(函数接口直接从 test_Native.h 中完整拷贝过来,注意加上形参): 1 #include <jni.h> 2 #include "test_Native.h" 3 #include <stdio.h> 4 5 JNIEXPORT void JNICALL Java_test_Native_run 6 (JNIEnv *env, jclass clazz){ 7 puts("Hello JAVA, I am C."); 8 }   此时工程看起来应当是这样子的:       由于使用 minGW 默认生成的 dll 函数署名带有 @ 分隔符,将导致后面JNI调用时产生 java.lang.UnsatisfiedLinkError: xoxoclass.xoxomethod() 错误,因此需要执行以下环节消除多余的 @ 符号。 配置 MyC 工程: MyC 工程上右键菜单 Properties ,左侧选择 C/C++ Build -> Settings ,右侧 Configuration 中显示的为当前正在显示的编译模板,[ Active ] 表达通过 Project->Build Project 菜单编译时使用的默认编译版本, minGW 将根据这些模板的属性设立,编译生成多套版本的 dll 或 exe ,有洁癖的同学可通过最右侧的 Manage Configurations... 按钮增删编译模板:   为了对比效果,笔主决定增长一套新模板 ReleaseNoAt ,继承默认的 Release 模板属性参数,并设立为Active,决不是由于洁癖或什么奇怪的因素:     OK返回刚才的编译模板属性配置界面,在 ReleaseNoAt 模板下,Tool Settins 页中的 MinGW C Linker -> Miscellaneous ,Linker flags 框中输入 -Wl,--kill-at,点击最下方的 Apply:   点击 MinGW C Linker ,显示的参数结果应当是这样的:   假如之前建立的C工程不是使用 Shared Library 模板,并且默认编译出的不是 dll 文献,可以在此选择 Build Artifact 页进行修改配置,Artifact Type 中选择 Shared Library ,Artifact extension 中选择 dll 即可,Output prefix 可指定输出 dll 文献的命名前缀:   OK拟定返回代码编辑界面,在 MyC 工程上右键菜单,Build Configurations->Build All,生成所有模板的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类 (由于时间关系,笔主已经事先偷偷违建了),在main方法中引用 Native类 的本地方法run(): 1 public class Test { 2 3 public static void main(String[] args) { 4 Native.run(); 5 } 6 }   最后一步,运营起来...好吧,上面已经偷跑了,最终结果如上图所示,Hello, I am Wavky.
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服