Tag: 共享库

在websphere共享库中使用CDI

我们使用websphere管理控制台中定义的共享库在多个应用程序之间共享类。 我想知道是否可以在这些类中使用CDI(上下文和dependency injection)? 如果是这样,我只需要将beans.xml放在共享库中的jar中,还是有进一步的步骤? 注意:我不能放弃使用共享库,因为这将是太多的重构工作。

在Ubuntu上的Tomcat中加载共享本机库

如何在Ubuntu上的Tomcat6中加载共享库? 我创建了一个名为“libawragrids.so”的库“awragrids”并将其放入 /var/lib/tomcat6/shared 我在终端中设置了以下环境变量,我从中调用start tomcat: export PATH=$PATH:/var/lib/tomcat6/shared export JAVA_OPTS=”-Djava.library.path=/var/lib/tomcat6/shared” export LD_LIBRARY_PATH=/var/lib/tomcat6/shared 然后我尝试加载库 private static final String GRIDTOOL_LIBRARY_NAME = “awratools”; static { try { System.loadLibrary(GRIDTOOL_LIBRARY_NAME); } catch (java.lang.SecurityException e) { System.out.println(“Not allowed to load dynamic library ” + GRIDTOOL_LIBRARY_NAME + “.”); throw e; } catch (java.lang.UnsatisfiedLinkError e) { System.out.println(“Failed to load dynamic library ” + GRIDTOOL_LIBRARY_NAME […]

从多个Java线程调用不可重入的本机共享库

我有一些Java代码调用一些本机代码,最初是用Fortran编写的,使用JNA。 (这是一个数值库,很多数学人员都在Fortran中进行编码。)它被编译成.so库,见下文: Fortran: https : //github.com/mizzao/libmao/tree/master/src/main/fortran Java绑定: https : //github.com/mizzao/libmao/blob/master/src/main/java/net/andrewmao/probability/MvnPackDirect.java 在我的代码中测试了所有单元,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败并出现奇怪的错误。 然后,我研究了一些关于重入Fortran代码的东西,并意识到我使用的库具有相当于一些全局变量(Fortran中的SAVE关键字,它记住了再次调用函数时变量的值: fortran SAVE语句 ) 现在我正在使用synchronized块包装对库的调用,但这显着地阻碍了性能。 在我看来,重新设计库是可重入的需要付出很大的努力(它有几千行数字代码,并且不清楚当子程序运行时值如何延续。)有谁知道解决问题的最佳方法是什么? 我的想象力表明…… 有没有办法让每个Java线程在内存中加载共享库的单独副本,以便全局变量实际上是线程本地的? 这有可能吗? 我不确定JNA的直接绑定或库绑定是如何工作的,如果有办法以这种方式使用它。 即使从不同的VM调用它,它仍然会被搞砸吗? 我该如何检查以确定? 有没有办法让gfortran ( gcc )以可重入的方式编译Fortran代码? 是否有一些快速而肮脏的方法使Fortran代码可以重入? 我搜索了RECURSIVE关键字,它显然将变量保存在堆栈中,但这似乎与现有代码不兼容。 还有其他可能的解决方 我确认多个虚拟机可以正常运行; 这是有道理的,因为他们不共享记忆。 仍然是一个PITA,但比线程更不方便。

java.lang.UnsatisfiedLinkError:无法加载eposprint:findLibrary返回null

我正在使用Android Studio。 我在我的应用程序中使用e-POS-Print.jar。 每当我运行代码时,我都会收到此错误: java.lang.ExceptionInInitializerError at com.stc.printer.MyActivity.onCreate(MyActivity.java:48) at android.app.Activity.performCreate(Activity.java:5163) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) at android.app.ActivityThread.access$600(ActivityThread.java:140) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4895) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load eposprint: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System.loadLibrary(System.java:535) at com.epson.eposprint.Print.(Print.java:18) at com.stc.printer.MyActivity.onCreate(MyActivity.java:48) 我的代码: […]

Java:使用依赖项加载共享库

我使用JNA用Java包装共享库(用C语言编写)。 共享库是内部编写的,但该库使用来自另一个外部库的函数,该库再次依赖于另一个外部库。 所以情况是这样的: ext1 < – ext2 < – 内部 即内部使用外部库ext2,它再次使用外部库ext1。 我试过的是: System.loadLibrary(“ext1”); System.loadLibrary(“ext2”); NativeLIbrary.loadLibrary(“internal”,xxx.class); 加载库“ext2”时,此方法失败并显示“UnresolvedException”; 链接器抱怨确实存在于库“ext1”中的符号。 所以它认为System.loadLibrary()函数不会使“ext1”中的符号全局可用? 当使用stdlib函数dlopen()时: handle = dlopen( lib_name , RTLD_GLOBAL ); 在@lib_name中找到的所有符号都可用于后续加载中的符号解析; 我想我喜欢的东西类似于java品种System.loadLibrary()? 问候 – Joakim Hove

有时在Android上忽略LD_LIBRARY_PATH

我有一个Android应用程序,它产生许多本机可执行文件与我随软件包分发的库有动态链接。 要启动这些二进制文件,我使用LD_LIBRARY_PATH环境变量使它们知道加载库的位置,但在某些设备上根本不起作用,LD_LIBRARY_PATH正确更新但二进制文件无法找到库。 这不是我可以重现的东西,因为在我的两个设备(Galaxy Nexus和Nexus 7与股票roms)它只是工作正常。 我尝试了很多方法,例如我产生: LD_LIBRARY_PATH=/my/package/custom/libs:$LD_LIBRARY_PATH && cd /binary/directory && ./binary 而且: String[] envp = { “LD_LIBRARY_PATH=” + libPath + “:$LD_LIBRARY_PATH” }; Process process = Runtime.getRuntime().exec( “su”, envp ); writer = new DataOutputStream( process.getOutputStream() ); reader = new BufferedReader( new InputStreamReader( process.getInputStream() ) ); writer.writeBytes( “export LD_LIBRARY_PATH=” + libPath + “:$LD_LIBRARY_PATH\n” ); writer.flush(); 但是在那些设备上似乎没有任何工作……所以我开始认为这是一个与内核相关的问题,一些内核(比如我的)使用LD_LIBRARY_PATH,其他内核没有(简单地忽略它,或者它们是仅使用在应用程序启动时设置的LD_LIBRARY_PATH,因此无法在运行时更改它。 […]

Java的内置库实现

有没有人碰巧知道在哪里可以看看java内置库的代码? 我已经尝试了Ctrl + Shift + B (这是Netbeans对Eclipse的Ctrl + Shift T的等价)来“转到源代码”,但我只能看到方法标题,并且正文总是: //compiled code throw new RuntimeException(“Compiled Code”); 例如,如果我试图查看String.charAt(int),我会看到以下内容 public char charAt(int i) { //compiled code throw new RuntimeException(“Compiled Code”); }

多个JVM进程可以共享公共类的内存吗?

我想在我的Web服务器上运行多个Java进程,每个Web应用程序一个。 我正在使用一个Web框架(Play),它有很多支持类和jar文件,Java进程使用大量内存。 One Play过程显示大约225MB的“驻留私人”内存。 (我在Mac OS X上使用Java 1.7.0_05进行测试。)特定于应用程序的代码可能只有几MB。 我知道典型的Java Web应用程序是添加到一个服务器进程(Tomcat等)的jar,但看起来运行Play的标准方法是作为独立的应用程序/进程。 如果这些是C程序,那么200MB的大部分将是共享库,而不是在每个应用程序中重复。 有没有办法在Java中实现这一点? 我看到一些关于类数据共享的页面,但这似乎只适用于核心运行时类。