澳门金沙国际 1

粗略准备干活:

以下具体操作方法可以间接百度,答案几乎是绝无仅有可看重的。

  1. 设置JDK,配置种类环境变量
  2. 未雨绸缪好一个带CDT插件的Eclipse,笔主使用的是google的ADT
    Bundle,自带了CDT,对应Eclipse 3.8.0版
  3. 下载一个MinGW(免费的C/C++等语言编译器套件),笔主限于公司垃圾网络,测试时行使mingw-offline-install-20120426
    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.21\bin\tcnative-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)
未能加载文件或程序集,手把手教你通过Eclipse工程计划调用JNI完全攻略。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.21\bin\tcnative-1.dll: Can’t load IA 32-bit
.dll on a AMD 64-bit platform]
java.lang.UnsatisfiedLinkError:
C:\apache-tomcat-8.0.21\bin\tcnative-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.21\bin\tcnative-1.dll: Cant load IA 32-bit .dll
on a AMD 64-bit platform,ia32bitplatform 汤姆cat启动报错: 25-Mar-2016
10…

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时安顿操作)

第4、5步额外添加的%JAVA_HOME%\include;%JAVA_HOME%\include\win32;是为着让eclipse在c/c++项目中自动引入那么些目录下的各类头文件,例如 jni.h,也可在切切实实项目的特性中以下义务展开点名:

 澳门金沙国际 2

 

跟汤姆cat相关的project,除了connector外,还有此外一个叫Tomcat
native,汤姆cat
native在切实可行的周转平台上,提供了一种优化技术,它自身是基于ARP(Apache
Portable Runtime)技术。也就是说,大家利用了汤姆cat
native技术以后,Tomcat在跟操作系统级其他相互方面可以做得更好,并且它更像apache一个,可以更好地看成一台web
server。

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

调用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.

假若大家是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的相干办法,

试了弹指间汤姆cat的启航,没有采用汤姆cat
native技术拓展启动,系统启动须求3秒多。而将汤姆cat
native放到bin目录之后,启动飞速,一秒种搞定!神啊。

末尾发现万分捕获, 
MessageShow.Show(e);封闭的形式引用的RevitAPIUI中的内容。

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

除去或转移方法解决难题。

以下是汤姆cat的起步截图:

 

澳门金沙国际 28

一连串统启动只花了1003ms。启动速度提升了2倍!

澳门金沙国际 29

相关文章