澳门新萄京: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)

 

汤姆cat Native 那一个类型得以让 汤姆cat 使用 Apache 的 apr 包来拍卖包涵文件和互联网IO操作,以进级品质。

java.lang.UnsatisfiedLinkError: C:apache-tomcat-8.0.21bintcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform,ia32bitplatform

汤姆cat运维报错:

 

25-Mar-2016 10:40:43.478 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer Could not contact localhost:8015. Tomcat may not be running.
25-Mar-2016 10:40:43.478 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer Catalina.stop:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:450)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:400)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:487)

25-Mar-2016 10:40:45.775 WARNING [main] org.apache.catalina.core.AprLifecycleListener.init The APR based Apache Tomcat Native library failed to load. The error reported was [C:apache-tomcat-8.0.21bintcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform]
java.lang.UnsatisfiedLinkError: C:apache-tomcat-8.0.21bintcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at org.apache.tomcat.jni.Library.<init>(Library.java:42)
at org.apache.tomcat.jni.Library.initialize(Library.java:171)
at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:197)
at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:106)
at org.apache.catalina.connector.Connector.setProtocol(Connector.java:564)
at org.apache.catalina.connector.Connector.<init>(Connector.java:66)
at org.apache.catalina.startup.ConnectorCreateRule.begin(ConnectorCreateRule.java:62)
at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1184)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1457)
at org.apache.catalina.startup.Catalina.load(Catalina.java:551)
at org.apache.catalina.startup.Catalina.load(Catalina.java:599)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)

 

原因,显然是 64位 的 Jdk 和 32 位的 tomcat 不兼容。

: C:apache-tomcat-8.0.21bintcnative-1.dll: Cant load IA 32-bit .dll on a 英特尔 64-bit platform,ia32bitplatform 汤姆cat运营报错: 25-Mar-二〇一四10...

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

 

跟汤姆cat相关的project,除了connector外,还大概有别的叁个叫汤姆cat native,汤姆cat native在切实可行的运营平台上,提供了生龙活虎种优化技能,它本身是基于ARP(Apache Portable Runtime卡塔尔国本领。也即是说,大家利用了Tomcat native技艺未来,汤姆cat在跟操作系统级其他并行方面能够做得更加好,何况它更像apache四个,能够更加好地看成意气风发台web server。

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 ,并将刚才 澳门新萄京:JNI使用方法,未能加载文件或程序集。Test 项目中变化的 test_Native.h 头文件拷贝(或瓜分卡塔尔到 MyC 工程的 src 文件夹下,Test 工程下的 test_Native.h 文本在背后的品种运转进程中校不再起别的效能,可删:

澳门新萄京 9

 

*  打开 MyC 工程下的 test_Native.h ,若 #include <jni.h> 提示 Unresolved inclusion: <jni.h> 的不当警报(如下图所示卡塔 尔(英语:State of Qatar),则表解毒前这几个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_澳门新萄京:JNI使用方法,未能加载文件或程序集。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 正是漫天劳动的始作俑者祸首卡塔 尔(英语:State of Qatar)

澳门新萄京 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类 (由于时间关系,笔主已经先行偷偷违反规章制度的建筑了卡塔 尔(英语:State of Qatar),在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.

假若我们是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的起步,未有行使汤姆cat 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文件的路径:JNIDemobinbaseJNIIterface .class

以下是汤姆cat的启航截图:

 

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

澳门新萄京 28

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

整个系统运转只花了1003ms。运行速度增加了2倍!

  3.应用visual studio编写接口的落成

澳门新萄京 29

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

      第一步:

      澳门新萄京 30

      第二步:

      澳门新萄京 31

      第三部:

      澳门新萄京 32

    导入供给的头文件

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

    include的win32索引下的jni_md.h文件拷贝到工程目录下(在开立的工程地点右键,然后点击尾数第二项就能够展开卡塔 尔(阿拉伯语:قطر‎

澳门新萄京 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文件

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

      澳门新萄京 34

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

      澳门新萄京 35

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

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

      然后依照如下步骤将dll文件作为Native Library加多进工程

        澳门新萄京 36

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

        澳门新萄京 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文件,还亟需展开深远探寻。

参照小说:

本文由澳门新萄京发布于澳门新萄京,转载请注明出处:澳门新萄京:JNI使用方法,未能加载文件或程序

上一篇:老车手又要飙车了,适合基于x64系统 下一篇:没有了
猜你喜欢
热门排行
精彩图文