`

linux64位下jni调用c/c++动态链接库

    博客分类:
  • jni
 
阅读更多
[size=medium]搭配的开发环境:
操作系统:linux(64位)
开发环境:Eclipse(64位)
Jdk版本:jdk1.6.0_26 (64位)

首先需要查看一下操作系统和环境变量中设置的jdk是多少位的,可以使用下面的命令:

查看操作系统位数: file /bin/ls
[root@LVS1 ~]#  file /bin/ls  
/bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

查看环境变量中设置的jdk位数: java -version
[root@LVS1 ~]# java -version
java version "1.6.0_26"

Eclipse(64位)是从网站上下载的可以运行在64位操作系统上的开发工具。

第一步:新建java project工程名jnitest,在src下面建立HelloWorld.java
\

public class HelloWorld {
	public native void SayHello( );// 是java本地方法申明

	public HelloWorld() {
	}

	static {
			System.loadLibrary("helloworld");// 装入动态链接库,"helloworld"是要装入的动态链接库名称。
	}

}


第二步:在src下面建立测试类ToSay.java 
public class ToSay {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(System.getProperty("java.library.path"));
		System.out.println(System.getProperty("os.arch"));
		HelloWorld hello = new HelloWorld();
		hello.SayHello( );

	}
} 

第三步:生成c/c++文件
1.生成HelloWorld.class文件
javac HelloWorld.java

2.生成HelloWorld.h文件
javah -classpath . HelloWorld

3.在src下新建立一个libhelloworld.cpp文件,生成libhelloworld.so文件
g++ -I /usr/java/jdk1.6.0_26/include/linux/ -I /usr/java/jdk1.6.0_26/include/ -fPIC -shared -o libhelloworld.so HelloWorld.cpp 
HelloWorld.cpp 源码
#include "HelloWorld.h"

#include <stdio.h>



JNIEXPORT void JNICALL Java_HelloWorld_SayHello(JNIEnv * env, jobject arg)

{
    printf("  64 位====  HelloWorld !/n");


    return;

}


4.指定libhelloworld.so动态库所在的路径
export LD_LIBRARY_PATH=/usr/java/jdk1.6.0_26/jre/lib/amd64/server

#LD_LIBRARY_PATH这个环境变量指示动态连接器可以装载动态库的路径。
此步是设置将库文件所在路径加入LD_LIBRARY_PATH中去,如果不执行此步,在运行中就会出现异常: java.lang.UnsatisfiedLinkError: no XXX in java.library.path 

5.生成ToSay.class文件
javac -cp . ToSay.java

6.测试ToSay
java -cp . ToSay
[root@LVS1 src]# java -cp . ToSay
/usr/java/jdk1.6.0_26/jre/lib/amd64/server:/usr/java/jdk1.6.0_26/jre/lib/amd64:/usr/java/jdk1.6.0_26/jre/../lib/amd64:/usr/java/jdk1.6.0_26/jre/lib/amd64/server:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
amd64
  64 位====  HelloWorld !/n



过程中如果出现
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/java/jdk1.6.0_20/jre/lib/i386/libhelloworld.so: /usr/java/jdk1.6.0_20/jre/lib/i386/libhelloworld.so: wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1720)
	at java.lang.Runtime.loadLibrary0(Runtime.java:823)
	at java.lang.System.loadLibrary(System.java:1028)
	at HelloWorld.<clinit>(HelloWorld.java:9)
	at ToSay.main(ToSay.java:9)

是因为jdk位数的问题,重装了个64位的jdk就行了,可能是因为服务器是64位的,32位的jdk调用64位的文件出问题,同步一下就好了。

看一下so文件的"地址",是32位的还是64的即可,或者有没有依赖/lib64下的文件.
ldd /usr/java/jdk1.6.0_26/jre/lib/amd64/server/libhelloworld.so
过程中如果出现
Exception in thread "main" java.lang.UnsatisfiedLinkError: no helloworld in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
	at java.lang.Runtime.loadLibrary0(Runtime.java:823)
	at java.lang.System.loadLibrary(System.java:1028)
	at HelloWorld.<clinit>(HelloWorld.java:9)
	at ToSay.main(ToSay.java:9)

是因为动态加载库的路径问题,可以指定动态加载库的路径 
export LD_LIBRARY_PATH=/usr/java/jdk1.6.0_26/jre/lib/amd64/server
[/size]
分享到:
评论

相关推荐

    java写的一个使用jni调用c/c++的dll

    本文将深入探讨如何使用Java通过JNI调用C/C++编写的DLL动态链接库。 首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    使用JNI进行混合编程:在Java中调用C/C++本地库

    JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的.dll或Linux下的.so文件)。JNI框架包括了Java端的本地方法声明和本地方法实现,以及C/C++端的...

    springboot+jna/jni调用动态so/dll库

    在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...

    C++库封装JNI接口-实现java调用c++

    5. **加载库**:在Java中,`System.loadLibrary()`会加载前面创建的动态链接库,使得Java能够调用C++实现的本地方法。 6. **测试和调试**:在Java程序中调用本地方法,验证C++代码是否正确工作。可能需要对JNI接口...

    JNA调用c/c++库示例

    如果`mylib`是一个动态链接库(.dll on Windows, .so on Linux, .dylib on macOS),加载代码如下: ```java MyLib myLib = (MyLib) Native.load("mylib", MyLib.class); ``` 现在,你可以像调用Java方法一样调用`...

    java调用C/C++的例子

    4. **编译JNI代码**:说明如何使用javah工具生成C/C++的头文件,以及如何使用C/C++编译器编译生成动态链接库(如.so或.dll文件)。 5. **加载库和调用函数**:解释如何在Java代码中加载动态链接库,并调用其中的方法...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

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

    ### JAVA如何调用DLL:用JNI调用C或C++动态链接库详解 #### 一、引言 在跨语言编程领域中,Java Native Interface (JNI) 是一种强大的工具,它允许Java应用程序直接调用本地代码(如C或C++)。这种能力在处理性能...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    使用C/C++编译器生成动态链接库(如`.so`或`.dll`),命令可能如下: ``` gcc -shared -o libjnibridge.so -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux ...

    通过JNI调用第三方动态库(生成两个.so文件)

    本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...

    java调用C/C++全过程

    将C/C++源代码编译为动态链接库(Windows下为`.dll`,Unix/Linux下为`.so`)。 5. **加载库文件**: 在Java程序中加载动态链接库,可以通过`System.loadLibrary()`方法指定库文件名。 ```java public class ...

    java调用C/C++过程

    5. **编译C/C++代码**:使用C/C++编译器(如GCC)将源代码编译为动态链接库(Windows上是.dll,Linux上是.so,Mac上是.dylib)。确保链接时包含JVM的库。 6. **运行Java程序**:最后,你可以在Java程序中调用`...

    JNI学习指南(java 调用C/C++接口)

    3. **编译并链接**:编译C/C++源代码,并将其链接成动态链接库(Windows下为.dll,Linux/Unix下为.so)。 4. **复制库文件**:将生成的动态链接库复制到Java程序的运行路径下。 5. **调用本地方法**:在Java程序中...

    在windows中jni(生成dll)Linux中jni(生成so),java调用曾c++

    在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    Java 调用DLL(动态链接库)主要是通过JNI(Java Native Interface)技术来实现的。JNI是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。在本例中,我们将详细介绍如何使用JNI调用C或C++编写的DLL...

    Java通过JNI调用C语言函数库的方法.zip

    这将生成一个动态链接库`libnative-lib.so`。 7. **运行Java程序** 将生成的本地库与Java类一起打包成jar文件,然后在Java程序中加载这个库,就可以调用本地方法了。例如: ```java public class Main { ...

    JNI调用C++的应用实例

    4. **构建动态库**:使用合适的编译器(如Windows上的Visual Studio或Linux上的GCC)将C/C++源代码编译为动态链接库(如Windows上的`.dll`或Linux上的`.so`文件)。 5. **加载动态库**:在Java代码中,通过`System....

    java调用C++编写的动态库dll

    在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...

Global site tag (gtag.js) - Google Analytics