`

jnative在linux下对c程序的动态链接库的调用问题及解决方案

 
阅读更多

 

本文参考自:http://blog.csdn.net/kongqz/article/details/4028012

    我下载了jnative的JNative_1.4RC3_src版本,在windows下按照常规操作步骤,将JNativeCpp.dll文件放到windows/system32目录下,然后进行jni编程,执行情况顺利。

    但是当我们将相同的程序放到linux下,并且将libJNativeCpp.so拷贝到/usr/lib下,然后执行的时候,发现我们的程序根本执行不了,这个时候,我进行了断点查看,发现那个jnative.jar文件中执行结果是这样的,如果是windows,直接找windows/system32/下的JNativeCpp.dll文件进行加载。

    如果是linux下的,那么他会调用一个system.getProperties("jnative.loadNative")来查找我们的libJNativeCpp.so,如果找不到,就直接到jnative.jar中寻找。

    这里我通过在调用之前设定了System的properties的jnative.loadNative值:

    System.setProperty("jnative.loadNative", "/usr/lib/libJNativeCpp.so");

    然后将libJNativeCpp.so放到该位置以供加载。

    但是结果仍旧是有问题,不论设置不设置都报错。经过断点跟踪发现,错误是“/lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./libJNativeCpp.so”

    这个错误引发原因就是libJNativeCpp.so被编译时的linux内核版本较低或者较高造成的。在当前平台上已经没有相关的组件支持了。

    解决方案:

    JNative_1.4RC3_src是没有libJNativeCpp.so的源文件的。但是Jnative.1.3.2版本中有。将他下边的源文件在我们要安装的linux系统下执行编译出一个libJNativeCpp.so文件。

    测试是否编译成功:ldd libJNativeCpp.so

    如果成功,会看到他依赖的组件都存在:

        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0069c000)
        libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00562000)
        libc.so.6 => /lib/tls/libc.so.6 (0x00134000)
        /lib/ld-linux.so.2 (0x0097b000)
    如果是版本不对,可能会显示

        ./libJNativeCpp.so: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by           ./libJNativeCpp.so)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0047e000)
        libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
        libc.so.6 => /lib/tls/libc.so.6 (0x0056e000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00c3d000)
        /lib/ld-linux.so.2 (0x0097b000)

分享到:
评论

相关推荐

    jnative调用动态库

    3. libJNativeCpp.so:这是Unix-like系统下的动态链接库,与JNativeCpp.dll类似,提供JNative在Linux、AIX或HP-UX等系统上与C++库交互的能力。 通过这些文件,开发者可以在Java应用程序中利用JNative库,无论是...

    jnative,调用动态链接库

    `jnative`是一个开源的Java库,它允许Java程序直接调用C和C++编写的动态链接库,从而扩展了Java的功能。它通过JNI(Java Native Interface)来实现这一目标,JNI是Java平台标准的一部分,为Java应用程序提供了与本地...

    在Java程序中使用JNative调用dll文件

    在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...

    java调用动态库(Jnative).zip

    4. **编译本地代码**:将C/C++源文件编译为动态链接库(如.dll on Windows,.so on Linux,.dylib on macOS)。 5. **加载库并调用方法**:在Java代码的静态块中,使用`System.loadLibrary`加载本地库,然后就可以...

    JNative-1.3.2.zip

    当Java程序通过JNative调用本地函数时,JNative.jar会与这个动态链接库协作,完成从Java到C++的调用过程。在Windows系统中,动态链接库允许程序在运行时加载所需的功能,而不是在编译时就绑定到特定的函数实现,这...

    JNative.jar以及JNative源码

    这两个文件是JNative库的本地实现部分,它们分别对应Windows和Linux下的动态链接库。当Java程序运行时,JNative.jar会加载对应的本地库,通过JNI桥接,实现Java与本地代码的交互。这意味着JNative不仅支持Windows...

    Java本地调用接口 JNative

    然后,使用C/C++编译器编译本地代码,生成动态链接库(如.dll文件在Windows上,.so文件在Linux上)。 3. **创建本地方法** - **声明本地方法**:在Java类中,使用`native`关键字声明本地方法,但不提供实现。 - *...

    JNative.rar

    而JNativeCpp.dll是Windows平台下的动态链接库,libJNativeCpp.so则是Linux平台下的动态链接库,它们实现了这些Java接口,提供了实际的本地功能。 JNI是Java平台的标准部分,允许Java代码与其他语言编写的代码进行...

    JNative.jar和JNativeCpp.dll

    其次,JNativeCpp.dll是一个动态链接库,它是针对Windows平台的原生代码实现部分。在Windows操作系统上,DLL文件被用来包含可由多个程序同时使用的函数和资源。JNativeCpp.dll很可能包含了实际的C++实现,这些实现...

    org.xvolks.jnative 源码

    `org.xvolks.jnative`是一个Java库,主要目标是简化Java程序与本地库(如动态链接库DLL或共享对象SO)的交互。它通过封装JNI接口,提供了友好的API,使得Java程序员无需直接接触复杂的JNI语法,即可实现跨语言调用。...

    JNative1.3.2

    3. **编写本地方法实现**:使用JNI规范创建对应的C/C++头文件和实现文件,然后编译成动态链接库(DLL或SO)。 4. **加载本地库**:在Java代码中使用`System.loadLibrary()`加载本地库。 5. **调用本地方法**:在...

    基于java的本地调用接口 JNative.zip

    3. **链接本地库**:将本地方法的实现编译成动态链接库(Windows上的`.dll`,Linux上的`.so`,MacOS上的`.dylib`)。然后在Java代码中使用`System.loadLibrary`加载这个库。 4. **Java代码调用本地方法**:在Java类...

    JNative-1.3.2

    在Java编程领域,有时我们需要调用本地动态链接库(DLL)来利用C++或C编写的特定功能,这通常涉及到JNI(Java Native Interface)。然而,JNI的学习曲线较陡峭,配置过程复杂,对于初学者和开发团队来说可能是一项...

    Java调用动态库最简便方法.pdf

    通过使用JNative组件,开发者可以更加高效地在Java程序中调用C/C++动态链接库,极大地简化了跨语言调用的过程。尽管JNative目前仍处于Beta阶段,但它已经展现出了极大的潜力和易用性,是Java开发人员值得尝试的一个...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单[归类].pdf

    通过上述步骤,我们成功地使用JNative在Java中调用了C/C++的动态链接库。这种方式不仅简化了开发过程,还提高了程序的性能。对于需要调用C/C++库的Java开发者来说,JNative提供了一个简洁而有效的解决方案。

    基于Java的实例源码-本地调用接口 JNative.zip

    4. **编译本地代码**:将C/C++代码编译为动态链接库(Windows上的.dll,Linux上的.so,Mac上的.dylib)。 5. **加载动态库**:在Java的静态初始化块中,使用`System.loadLibrary`加载本地库,如`System.loadLibrary...

    Java调用dll文件开源组件jar包及说明文档

    `JNative-1.3.2`是一个开源组件,专门设计用于帮助Java应用程序调用Windows平台上的DLL(动态链接库)文件,同时也支持Linux平台下的SO(共享对象)文件。下面我们将详细介绍这个组件的使用方法、工作原理及相关知识...

    基于Java的本地调用接口 JNative.zip

    3. **动态链接库编译**:将实现本地方法的C/C++源代码编译成动态链接库(Windows上的.dll,Linux上的.so,Mac OS X上的.dylib)。 4. **加载和注册**:在Java代码中,使用`System.loadLibrary`加载动态链接库,并在...

    Java类中调用dll的步骤及jar包

    在Java编程环境中,有时我们需要利用已经存在的C++或者C库(通常以.dll文件形式存在于Windows系统,.so文件在Linux系统)来扩展功能或解决特定问题。Java本身并不支持直接调用dll,但通过一些技术手段可以实现。本文...

    jna4.4.0+jna-platform4.4.0+JNative.zip

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统API,无需编写C语言的动态链接库(DLL)或使用Java的本机接口(JNI)。JNA通过提供一种高级映射,使得Java程序员能够轻松地访问...

Global site tag (gtag.js) - Google Analytics