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

2019-11-08 10:57栏目:网络操作
TAG:

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,也可在切实可行品种的性子中以下职务举行点名:

 澳门新葡亰平台官网 1

 

在开发银行revit此前无法实践RevitAPI.dll和RevitAPIUI.dll的相干办法,

        澳门新葡亰平台官网 2

调用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 文件实行查看(具体方法不报告你卡塔 尔(英语:State of Qatar):

Release版(下边这一个 @8 就是全部劳动的罪魁祸首卡塔尔

澳门新葡亰平台官网 23

 

ReleaseNoAt版(干净了)

澳门新葡亰平台官网 24

 

回到eclipse,在 Test 工程中新建文件夹 dll (命名随便卡塔尔国,并将方素不相识成的 ReleaseNoAt版 libMyC.dll 拷贝到这些dll文件夹中,重命名叫 myCLib.dll(因为上文 Native类 中通过 System.loadLibrary("myCLib"); 加载了这些名字的dll文件,当然你也可以更改代码变成System.loadLibrary("libMyC"); 来代替重命名卡塔 尔(英语:State of Qatar),从此 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.

 

 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 }

总结筹划干活:

以下具体操作方法能够直接百度,答案差十分少是唯风姿浪漫可信的。

  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)

 

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

  1. 创建java端接口

检查程序流程:登陆,配置,运营revit。

    并编辑如下代码:

删除或转移方法解除难题。

    6.编写制定测量试验类,检证JNI是或不是成功使用

末段开采十分捕获,  MessageShow.Show(e);密封的不二诀窍引用的RevitAPIUI中的内容。

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

澳门新葡亰平台官网 28

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

      第二步:

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

    运营后的测量试验结果如下:

 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 }

      第一步:

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

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

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

 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 }

      澳门新葡亰平台官网 29

      澳门新葡亰平台官网 30

        澳门新葡亰平台官网 31

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

      澳门新葡亰平台官网 32

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

    创设成效达成文件

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

    导入须求的头文件

      将方面第二步生成的头文件,以致jdk根目录下include目录下的jni.h和

      第三部:

下边记录一下JNI简单的接受办法

      澳门新葡亰平台官网 33

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

100成功??JNI??DEMO

  4.生成dll文件

    上面创立的JNIIterface类,JNIIterface .class文件的门路:JNIDemobinbaseJNIIterface .class

澳门新葡亰平台官网 34

    include的win32目录下的jni_md.h文件拷贝到工程目录下(在创设的工程方面右键,然后点击倒数第二项就足以张开卡塔 尔(阿拉伯语:قطر‎

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

参照随笔:

    编辑上海体育地方所示的Native Library Location,然后在弹出的分界面选拔Native Library所在的文本夹:

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

对于怎么利用已经写好的第三方dll文件的意义,举例系统的dll文件,还亟需张开浓重探究。

      澳门新葡亰平台官网 35

版权声明:本文由澳门新葡亰平台游戏发布于网络操作,转载请注明出处:JNI使用方法,未能加载文件或程序集