JNI路径有关问题,该把DLLfile文件路径问题放在什么位置

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
有赞的日子
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3155)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_085',
blogTitle:'Java中操作Windows注册表registry-3.1.3.zip压缩包解开后ICE_JNIRegistry.dll文件应该放在哪里位置?(not installed the DLL named \'ICE_JNIRegistry.DLL\'.)',
blogAbstract:'
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Posts - 1,
Articles - 0,
Comments - 0
15:42 by muyonghua, ... 阅读,
&& 通常我们在写大型项目时,也就是集成的项目时,单独用JAVA语言去完成所有的事情往往效果不佳,也不能很好的完成,例如:我们要去调硬件,获取电脑的运行状况等等(如果用JAVA语言实现时,往往耗时),基于此,我们就要寻求一种很好的解决方案,那就是利用别的语言的长处了,如:C++(它在对底层的调用和硬件方面确实够强悍)。如果我们能用C++实现对硬件的所有操作,然后我们再用JAVA去调C++实现的东西,那不是很完美了,鉴于这样的情况,我们的JNI就应运而生了,我们都知道,JNI调C++实现的东西也就是去调C++运行时生成的*.DLL文件,此时问题就出现了,我们通常调DLL都用1、System.load(String filename);& //指定加载的dll全路径文件名;2、System.LoadLibrary(String dllname);& //指定加载的dll名(无path,无后缀),这两种方法很坑爹,如要你利用Eclipse编辑工具时,你必须指定它的本机库位置(点击项目右键属性-》JAVA构造路径-》源代码下拉-》本地库位置-》编缉指定文件后搞定),否则你打死它它也说找不到DLL资源(反正我试了是没有行,也许我的RP值不够吧!),如果你指定了它的本机库位置了,先恭喜你,此时你运行在你的机子上确实成功了,但是,你不要高兴得早,试想,你在这是写死了的,那放到别的机子上,它还能跑起来吗,在这,我可以很负责任的告诉你,那是不行的,这样不是和我们的JAVA程序编译一次,到处跑相悖了吗,你读到这可能受不了,那我应怎么解决呢?你要相信,一个问题的产生肯定有它的解决方法,它的解决方法也许有上百种,你才用一两种就放弃了,那不是太可惜了,所以,接下来就是见证奇迹的时候了,具体方法如下:我在程序中的代码如下
public class HelloWorld {
--------------静态代码块就是动态的获取DLL,这样后你就跟上JAVA程序编译一次,到处跑的步伐了-------------------------------
&static {&&try {&&&String libpath = System.getProperty("java.library.path");&&&if (libpath == null || libpath.length() == 0) {&&&&throw new RuntimeException("java.library.path is null");&&&}
&&&String path =&&&StringTokenizer st = new StringTokenizer(libpath, System&&&&&.getProperty("path.separator"));&&&if (st.hasMoreElements()) {&&&&path = st.nextToken();&&&} else {&&&&throw new RuntimeException("can not split library path:"&&&&&&+ libpath);&&&}
&&&Class thisClass = HelloWorld.&&&InputStream inputStream = thisClass.getResource("HelloWorld.dll")&&&&&.openStream();&&&File dllFile = new File(new File(path), "HelloWorld.dll");&&&if (!dllFile.exists()) {&&&&FileOutputStream outputStream = new FileOutputStream(dllFile);&&&&byte[] array = new byte[8192];&&&&for (int i = inputStream.read(array); i != -1; i = inputStream&&&&&&.read(array)) {&&&&&outputStream.write(array, 0, i);&&&&}&&&&outputStream.close();&&&&// System.loadLibrary("RegistryUtil");&&&}
&&&&System.loadLibrary("HelloWorld");//这样加载的DLL就不用去指定什么本机库位置了
&&} catch (UnsatisfiedLinkError e) {&&&&&} catch (Throwable e) {&&&throw new RuntimeException("load RegistryUtil.dll error!", e);&&}&}
&public native void sayHello();// 表示要在c++本地实现的方法
&public static void main(String[] args) {&&new HelloWorld().sayHello();&}
接下来就是如何把DLL也打进JAR包里吧,其实so easy,你只要把整个项目都导出就可以了,这样你的JAR包里就有了DLL文件,此时就功德圆满了。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(4758)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_083067',
blogTitle:'java 中System.loadLibrary()调用c++Dll的路径问题',
blogAbstract:'当使用System.loadLibrary()调用C++ Dll 时要确定dll的路径,我试了两种方法都可以实现。\r\n1.设定环境变量。\r\n比如:所编辑的Dll在目录“D:\\cppProjects\\nativecode\\release”内,就可以将这个路径复制下来,添加到电脑的环境变量中的path变量内即可。\r\n2.设定项目属性。\r\n右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面“D:\\cppProjects\\nativecode\\release”路径。(当然如果将dll拷贝到workspace下也可以用相对路径。也可右击“src”设定其properties内Native Library项。)',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于JNI调用DLL,DLL应该放在哪_百度知道
关于JNI调用DLL,DLL应该放在哪
我有更好的答案
通过调用本地的库文件的内部方法关于JNI调用DLL、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,DLL应该放在哪JAVA通过JNI调用本地方法.loadLibrary(“goodluck”),库的扩展名字可以不用写出来,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式),使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下;
一,如下:
采纳率:96%
来自团队:
为您推荐:
其他类似问题
勃兰兑斯的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 1177255
博文数量: 392
博客积分: 9328
博客等级: 中将
技术积分: 2660
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++ 00:16:36
一,附加方式
1,eclipse链接库引用到vs的debug目录下 ,例如:
System.load("E:\\vcproject\\debug\\test.dll");
2,在C++的被调用方法中写入一个死循环。
3,eclipse 运行java程序,调用dll库方法,这是就卡在DLL内部的死循环中
4,在C++的死循环内设置断点,VS中debug属性命令里面:E:\tools\Java\jdk1.6.0_11\bin\javaw.exe 设置“附加”为 是
5,VS点击调试,就进到C++的死循环中了,跳出死循环就可以开始调试了
二,常规调试
1,eclipse链接库引用到vs的debug目录下 ,例如:
System.load("E:\\vcproject\\debug\\test.dll");
2,设置工程属性
Command设为java命令的路径,例如:D:\Java\jdk1.7.0_15\bin\java.exe&
Command Arguments设为需要的java启动参数,例如:-cp .;lib\*; com.test.MyJNI
Working Directory设置为java工程的根目录(这里是部署目录,不是IDE中的开发环境目录,因为这里调试是通过命令行启动虚拟机的,所以无法通过IDE启动java项目)
3,在JNI的C++代码中中打好断点,点击debug,当java项目运行到JNI调用位置时,就捕获到断点进行调试了。
注意,这里的dll一定要是debug版本且需要生成PDB文件,如果禁用了PDB生成,需要设置generate debug info为yes
阅读(3129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 css文件路径问题 的文章

 

随机推荐