JNI使用方法,未能加载文件或程序集

by admin on 2019年3月22日

home88一必发 1

不难准备干活:

以下具体操作方法能够平素百度,答案大概是唯一可相信的。

  1. 安装JDK,配置体系环境变量
  2. 预备好一个带CDT插件的Eclipse,笔主使用的是google的ADT
    Bundle,自带了CDT,对应Eclipse 3.8.0版
  3. 下载三个MinGW(免费的C/C++等语言编写翻译器套件),笔主限于公司垃圾网络,测试时选择mingw-offline-install-20130426
    v4.6.2版,安装时仅需勾选(在线安装版下载数据量约50Mb):
  • C Compiler
  • C++ Compiler
  • JNI使用方法,未能加载文件或程序集。MinGW Developer Toolkit (Indudes MSYS Basic System)

 

JNI能够让我们在java代码中调用本地库的功效。

Tomcat Native 那些种类得以让 Tomcat 使用 Apache 的 apr
包来处理包含文件和网络IO操作,以升高品质。

revit二遍开发中相见的难题

陈设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时布署操作)

第④ 、5步额外添加的%JAVA_HOME%\include;%JAVA_HOME%\include\win32;是为着让eclipse在c/c++项目中自行引入这么些目录下的各种头文件,例如 jni.h,也可在具体品种的习性中以下职责举办点名:

 home88一必发 2

 

下边记录一下JNI简单的行使办法

跟汤姆cat相关的project,除了connector外,还有此外三个叫汤姆cat
native,汤姆cat
native在现实的运维平台上,提供了一种优化技术,它本人是基于APRADOP(Apache
Portable Runtime)技术。也便是说,大家接纳了汤姆cat
native技术今后,汤姆cat在跟操作系统级别的相互方面能够做得更好,并且它更像apache二个,能够更好地作为一台web
server。

RevitAPIUI.dll 只好 Native Library 中进行; 脱离了Native Library,API是跑不起来的

调用JNI全过程:

创办3个普通java工程 Test,添加多个特地负责引入调用本地库的类 Native,代码如下:

home88一必发 3

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

home88一必发 4

 

开辟CMD….好呢,笔主认同题目党了,整个博文仅此一处须求一句不难的吩咐!
CMD导航至项目文件夹下的 src 目录,输入 javah
test.Native
(要求选拔包名.类名的完好限定名称),生开销地点法接口头文件 test_Native.h

home88一必发 5

 

刷新eclipse的 Package Explorer
应该会成为那样的目录状态,个中刚才刚才生成的 test_Native.h 文本代码如下图示(笔主抢闸成立了JNI使用方法,未能加载文件或程序集。Test类,稍候用于调用Native类的本土方法):

home88一必发 6

 

 

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

home88一必发 7

home88一必发 8

 

 在 MyC 工程内创立二个文本夹 src ,并将刚才 Test 项目中变化的 test_Native.h 头文件拷贝(或分开)到 MyC 工程的 src 文件夹下,Test 工程下的 test_Native.h 文本在后边的门类运作进度中校不再起别的功能,可删:

home88一必发 9

 

*  打开 MyC 工程下的 test_Native.h ,若 #include
<jni.h>
 提示 Unresolved inclusion:
<jni.h>
 的失实警告(如下图所示),则表镇痛前以此C项目没有点名 jni.h 的头文件地点,参考上文 安排MinGW的条件变量 的第陆、5步实行布局:

home88一必发 10

 

 **  MyC 工程文件中接口函数代码上提示的 Syntax
error 
能够一时忽略,据闻是eclipse语法检查和测试的1个bug:

 home88一必发 11

 

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

home88一必发 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 }

home88一必发 13

 

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

home88一必发 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… 按钮增加和删除编写翻译模板:

home88一必发 15

 

为了相比效果,笔主决定追加一套新模板 ReleaseNoAt ,继承暗中同意的
Release 模板属性参数,并设置为Active,决不是因为洁癖或怎么着意外的案由:

home88一必发 16  home88一必发 17

 

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

home88一必发 18

 

点击 MinGW C Linker ,彰显的参数结果应当是那般的:

home88一必发 19

 

就算在此以前建立的C工程不是选择 Shared
Library
 模板,并且默许编写翻译出的不是 dll 文件,可以在此选拔 Build
Artifact
 页举行改动配置,阿特ifact Type 中精选 Shared
Library 
,Artifact extension 中选择 dll 即可,Output prefix
可钦命输出 dll 文件的命名前缀:

home88一必发 20

 

OK鲜明重临代码编辑界面,在 MyC 工程上右键菜单,Build
Configurations->Build All,生成全部模板的dll文件版本:

home88一必发 21

 

各版本 dll 如下图所示,控制弗罗茨瓦夫得以观察各种 dll
生成所用的命令参数(今后展现的是 ReleaseNoAt 本子,即唯一配置了去掉@符号的模板):

home88一必发 22

 

为了验证暗许 Release 与 ReleaseNoAt 版本的界别,可用 dllexp 那些工具打开那七个dll 文件举行查看(具体方法不告知你):

Release版(上面这几个 @8 正是一体劳动的元凶祸首)

home88一必发 23

 

ReleaseNoAt版(干净了)

home88一必发 24

 

回到eclipse,在 Test 工程中新建文件夹 dll (命名随意),并将上边生成的 ReleaseNoAt版 libMyC.dll 拷贝到那个dll文件夹中,重命名为 myCLib.dll(因为上文 Native类 中通过
System.loadLibrary(“myCLib“);
加载了那几个名字的dll文件,当然你也能够修改代码变成
System.loadLibrary(“libMyC“);
来取代重命名),此后 MyC 工程将不再起别的功能,可删:

home88一必发 25

 

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

home88一必发 26

 

Test工程 test包中新建 Test类 (由于岁月涉及,笔主已经先行偷偷违反规制的建筑了),在main方法中引用 Native类 的地头方法run():

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

home88一必发 27

 

最终一步,运行起来…可以吗,上面已经偷跑了,最后结出如上海体育地方所示,Hello, I
am Wavky.

  1. 创建java端接口

借使我们是Wn32/Wind64的操作系统,我们得以下载tcnative-1-ipv4.dll或tcnative-1-ipv6.dll,并把那个文件放在%汤姆cat_HOME%/bin目录下就足以了,那样汤姆cat会有更好的performance。

检查程序流程:登录,配置,运转revit。

咱俩必要采纳相应的操作系统,对于windows操作系统比较便于,直接下载dll文件,然后丢到汤姆cat的bin即可,而对于Linux,大家还亟需遵从document进行布置跟编辑才能应用。

在开发银行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 }

试了刹那间汤姆cat的运行,没有利用Tomcat
native技术拓展运维,系统运营要求3秒多。而将汤姆cat
native放到bin目录之后,运行快速,一秒种消除!神啊。

末段发现非凡捕获, 
MessageShow.Show(e);封闭的章程引用的RevitAPIUI中的内容。

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

Tomcat在Linux上使用Native
Library
 
http://www.linuxidc.com/Linux/2014-10/108600.htm

删去或转换方法消除难点。

    上边创造的JNIIterface类,JNIIterface
.class文件的途径:\home88一必发,JNIDemo\bin\base\JNIIterface .class

以下是汤姆cat的运维截图:

 

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

home88一必发 28

    然后会在\JNIDemo\bin\目录下生成base_JNIIterface.h文件

成套系统运行只花了1003ms。运转速度升高了2倍!

  3.使用visual studio编写接口的兑现

home88一必发 29

    创设C工程,具体步骤如下:

      第一步:

      home88一必发 30

      第二步:

      home88一必发 31

      第三部:

      home88一必发 32

    导入供给的头文件

      将上面第壹步生成的头文件,以及jdk根目录下include目录下的jni.h和

    include的win32索引下的jni_md.h文件拷贝到工程目录下(在开立的工程方面右键,然后点击尾数第2项就足以打开)

home88一必发 33

    创立功效实现公文

      在工程目录下源文件上右键,然后点击-》,创制一个cpp文件

    并编写如下代码:

 1 #include "base_JNIIterface.h" 2 #include "jni.h" 3 #include <stdio.h> 4  5 JNIEXPORT jint JNICALL Java_base_JNIIterface_MyMethod 6   (JNIEnv *, jobject){ 7       printf("成功实现JNI测试DEMO"); 8       return 0; 9 }10 11 JNIEXPORT jint JNICALL Java_base_JNIIterface_add12   (JNIEnv *, jobject, jint a, jint b){13       return a + b;14 }

  4.生成dll文件

    在工程目录中的「化解方案」上右键,选拔属性,然后如下图所示构成连串

      home88一必发 34

    然后编写翻译工程后,会在工程目录下的Release目录下成成dll文件

      home88一必发 35

  5. 将dll文件配置到java工程

      首先向dll文件放在java工程根目录下的lib目录下

      然后根据如下步骤将dll文件作为Native Library添加进工程

        home88一必发 36

    编辑上海教室所示的Native Library
Location,然后在弹出的界面选用Native Library所在的文本夹:

        home88一必发 37

    6.编制测试类,检证JNI是还是不是中标选择

 1 public class HelloJNI { 2  3     public static void main(String[] args) { 4         JNIIterface hw = new JNIIterface(); 5         int t = hw.add(3, 7); 6         int s = hw.MyMethod(); 7         System.out.println; 8         System.out.println; 9     }10 }

    运营后的测试结果如下:

100成功??JNI??DEMO

地点就是记录了使用JNI的最基本步骤。

对此如何行使已经写好的第贰方dll文件的效能,比如系统的dll文件,还索要开展长远切磋。

参考著作:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图