jni中关于dll的装载问题[转]

摘要:
你必须相信一定有解决问题的办法。可能有数百种解决方案。使用一两种解决方案后放弃并不太糟糕。因此,是时候见证奇迹了,具体方法如下:我在程序中的代码如下:publicclassHelloWorld{------------------静态代码块是动态访问DLL,因此您可以遵循JAVA程序编译一次并在任何地方运行----------------------------------静态{try{Stringlibpath=System.getProperty;if{thrownewRuntimeException;}Stringpath=空;StringTokenizerst=newStringTokenizer;如果{path=st.nexToken();}否则{thrownewRuntimeException;}ClassthisClass=HelloWorld。班InputStreaminputStream=thisClass.getResource。openStream();FiledllFile=newFile;如果(!

   通常我们在写大型项目时,也就是集成的项目时,单独用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 = null;
   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.class;
   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) {
   throw 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文件,此时就功德圆满了。

免责声明:文章转载自《jni中关于dll的装载问题[转]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇go 优化技巧SpringCloud之Hystrix Dashbord监控中心+分布式配置中心下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# HttpWebResponse 调用WebApi

public static class WebApiCaller { public static string HttpPost(string url, string body) { try { //ServicePointManager...

C# PropertyGrid使用总结

1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高; 2. enum会自动使用列表框表示; 3. 自...

张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结

1. 抽象方法的使用   如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 public static Weekend SUN = new Weekend(); //周一...

LeetCode(71):简化路径

Medium! 题目描述: 给定一个文档 (Unix-style) 的完全路径,请进行路径简化。 例如,path="/home/", =>"/home"path="/a/./b/../../c/", =>"/c" 边界情况: 你是否考虑了 路径 ="/../"的情况?在这种情况下,你需返回"/"。 此外,路径中也可能包含多个斜杠'/',如"/...

mysql和Oracle在对clob和blob字段的处理

一、MySQL与Oracle数据库如何处理Clob,Blob数据类型 (1)不通数据库中对应clob,blob的类型如下: MySQL中:clob对应text,blob对应blob DB2/Oracle中:clob对应clob,blob对应blob (2)domain中对应的类型: clob对应String,blob对应byte[] clob对应ja...

JAVA 实现CLOB转String

CLOB 定义   数据库中的一种保存文件所使用的类型。   Character Large Object   SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(C...