手把手教你通过Eclipse工程布署调用JNI完全战略

作者:杏彩

图片 1

JNI能够让大家在java代码中调用本地库的功能。

轻巧易行策画干活:

以下具体操作方法能够直接百度,答案差非常的少是无可比拟可信赖的。

  1. 安装JDK,配置连串情状变量
  2. 预备好三个带CDT插件的Eclipse,笔主使用的是google的ADT Bundle,自带了CDT,对应Eclipse 3.8.0版
  3. 下载贰个MinGW(无偿的C/C++等语言编写翻译器套件),笔主限于集团垃圾网络,测量检验时采纳mingw-offline-install-二零一一0426 v4.6.2版,安装时仅需勾选(在线安装版下载数据量约50Mb):
  • C Compiler
  • C++ Compiler
  • MinGW Developer Toolkit (Indudes MSYS Basic System)

 

revit二遍开采中遇见的标题

上面记录一下JNI轻松的使用办法

布署MinGW的情状变量:

  1. 张开情况变量(系统变量),增多 MINGW_HOME 变量,变量值是刚才MinGW的设置地点,如 D:Program FilesMinGW
  2. 安装path变量,编辑path变量增加%MINGW_HOME%bin;%MINGW_HOME%msys1.0bin;
  3. 添加 LIBRARY_PATH 变量,变量值 %MINGW_HOME%lib
  4. 添加 C_INCLUDE_PATH 变量,变量值 %JAVA_HOME%include;%JAVA_HOME%includewin32;%MINGW_HOME%include
  5. 添加 CPLUS_INCLUDE_PATH 变量,内容 %JAVA_HOME%include;%JAVA_HOME%includewin32;%MINGW_HOME%libgccmingw324.5.2includec++
  6. Win7点击分明后任何时候生效,若未见效请重启系统(参考安装JDK时布署操作)

第4、5步额外加多的%JAVA_HOME%include;%JAVA_HOME%includewin32;是为着让eclipse在c/c++项目中自动引进那个目录下的各类头文件,比如 jni.h,也可在切切实实项目标习性中以下职分展开点名:

 图片 2

 

RevitAPIUI.dll 只可以 Native Library 中实施; 脱离了Native Library,API是跑不起来的 。

  1. 创建java端接口

调用JNI全过程:

始建一个平淡无奇java工程 Test,加多一个特意担任引进调用本地库的类 Native,代码如下:

图片 3

1 public class Native {
2     // 声明自定义本地库方法接口
3     native public static void run();
4     
5     // 自动加载本地库文件,如文件名全称为 myCLib.dll
6     static{
7         System.loadLibrary("myCLib");
8     }
9 }

图片 4

 

展开CMD....行吗,笔主认同标题党了,整个博文仅此一处索要一句轻易的通令! CMD导航至项目文件夹下的 src 目录,输入 javah test.Native(要求利用包名.类名的完整限定名称),生开销位置法接口头文件 test_Native.h

图片 5

 

刷新eclipse的 Package Explorer 应该会成为那样的目录状态,当中刚才刚才生成的 test_Native.h 文本代码如下图示(笔主抢闸创设了Test类,稍候用于调用Native类的本地点法):

图片 6

 

 

创设三个新的 C 工程 MyC,期望编写翻译成dll的时候,选拔 Shared Library 下的模板:

图片 7

图片 8

 

 在 MyC 工程内成立三个文本夹 src ,并将刚才 Test 项目中生成的 test_Native.h 头文件拷贝(或分开)到 MyC 工程的 src 文件夹下,Test 工程下的 test_Native.h 文本在前面包车型客车连串运转过程大校不再起另外成效,可删:

图片 9

 

*  打开 MyC 工程下的 test_Native.h ,若 #include <jni.h> 提示 Unresolved inclusion: <jni.h> 的谬误警示(如下图所示),则表宁心前以此C项目未有一点点名 jni.h 的头文件地点,参照他事他说加以考察上文 安插MinGW的意况变量 的第4、5步进行安排:

图片 10

 

 **  MyC 工程文件中接口函数代码上提醒的 Syntax error 能够暂且忽视,据闻是eclipse语法检查评定的三个bug:

 图片 11

 

 在 MyC 工程 src 文件夹中,新建贰个C的落到实处类 NativeC.c ,引进接口头文件 jni.htest_Native.h ,并编辑接口函数 JNICALL Java_test_Native_run 的兑现(函数接口直接从 test_Native.h 中总体拷贝过来,注意加上形参):

图片 12

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 }

图片 13

 

那会儿工程看起来应当是那样子的:

图片 14 

 

 

是因为选取 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... 按键增删编写翻译模板:

图片 15

 

为了相比较效果,笔主决定扩大一套新模板 ReleaseNoAt ,承继暗中同意的 Release 模板属性参数,并安装为Active,决不是因为洁癖或什么奇异的案由:

图片 16  图片 17

 

OK重回刚才的编译模板属性配置分界面,在 ReleaseNoAt 模板下,Tool Settins 页中的 MinGW C Linker -> Miscellaneous ,Linker flags 框中输入 -Wl,--kill-at,点击最下方的 Apply:

图片 18

 

点击 MinGW C Linker ,展现的参数结果应该是那般的:

图片 19

 

设若从前创设的C工程不是运用 Shared Library 模板,何况暗中同意编译出的不是 dll 文件,可以在这里接纳 Build Artifact 页进行修改配置,Artifact Type 中选用 Shared Library ,Artifact extension 中选择 dll 就可以,Output prefix 可钦命输出 dll 文件的命名前缀:

图片 20

 

OK明确再次来到代码编辑分界面,在 MyC 工程上右键菜单,Build Configurations->Build All,生成全体模板的dll文件版本:

图片 21

 

各版本 dll 如下图所示,调节台南能够见到种种 dll 生成所用的授命参数(以往来得的是 ReleaseNoAt 本子,即独一配置了去掉@符号的沙盘):

图片 22

 

为了验证暗中认可 Release 与 ReleaseNoAt 版本的分别,可用 dllexp 这几个工具展开那四个dll 文件实行查看(具体方法不告诉您):

Release版(上面这么些 @8 正是全方位劳动的罪魁祸首祸首)

图片 23

 

ReleaseNoAt版(干净了)

图片 24

 

回到eclipse,在 Test 工程中新建文件夹 dll (命名随便),并将下不熟习成的 ReleaseNoAt版 libMyC.dll 拷贝到那么些dll文件夹中,重命名为 myCLib.dll(因为上文 Native类 中通过 System.loadLibrary("myCLib"); 加载了这一个名字的dll文件,当然你也得以修改代码变成System.loadLibrary("libMyC"); 来代替重命名),此后 MyC 工程将不再起任何功用,可删:

图片 25

 

配置 Test工程 属性,钦定工程的地面库目录,间接看图:

图片 26

 

Test工程 test包中新建 Test类 (由于时间关系,笔主已经先行偷偷违反规制的建筑了),在main方法中引用 Native类 的本地点法run():

1 public class Test {
2 
3     public static void main(String[] args) {
4         Native.run();
5     }
6 }

图片 27

 

提及底一步,运维起来...好吧,上边已经偷跑了,最终结出如上航海用教室所示,Hello, I am Wavky.

检查程序流程:登入,配置,运维revit。

在开发银行revit从前不能够施行RevitAPI.dll和RevitAPIUI.dll的连锁办法,

 1 public class JNIIterface { 2  3     // 导入最终生成的dll文件 4     static { 5         System.loadLibrary("JNIDemo"); 6     } 7  8     // 声明dll文件中实现的接口 9     public native int MyMethod();10     11     public native int add(int x, int y);12 }

最后开掘极度捕获,  MessageShow.Show(e);密封的不二秘籍引用的RevitAPIUI中的内容。

  2. 生成接口对应的C的头文件

去除或转移方法消除难点。

    上边制造的JNIIterface类,JNIIterface .class文件的不二等秘书技:JNIDemobinbaseJNIIterface .class

 

    在工程目录下的bin目录下试行命令:javah -classpath . -jni base.JNIIterface

    然后会在JNIDemobin目录下生成base_JNIIterface.h文件

  3.施用visual studio编写接口的达成

    制造C工程,具体步骤如下:

      第一步:

      图片 28

      第二步:

      图片 29

本文由杏彩发布,转载请注明来源

关键词: