[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动态链接库。 首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码...
JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...
JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的.dll或Linux下的.so文件)。JNI框架包括了Java端的本地方法声明和本地方法实现,以及C/C++端的...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
5. **加载库**:在Java中,`System.loadLibrary()`会加载前面创建的动态链接库,使得Java能够调用C++实现的本地方法。 6. **测试和调试**:在Java程序中调用本地方法,验证C++代码是否正确工作。可能需要对JNI接口...
如果`mylib`是一个动态链接库(.dll on Windows, .so on Linux, .dylib on macOS),加载代码如下: ```java MyLib myLib = (MyLib) Native.load("mylib", MyLib.class); ``` 现在,你可以像调用Java方法一样调用`...
4. **编译JNI代码**:说明如何使用javah工具生成C/C++的头文件,以及如何使用C/C++编译器编译生成动态链接库(如.so或.dll文件)。 5. **加载库和调用函数**:解释如何在Java代码中加载动态链接库,并调用其中的方法...
### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...
### JAVA如何调用DLL:用JNI调用C或C++动态链接库详解 #### 一、引言 在跨语言编程领域中,Java Native Interface (JNI) 是一种强大的工具,它允许Java应用程序直接调用本地代码(如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文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...
将C/C++源代码编译为动态链接库(Windows下为`.dll`,Unix/Linux下为`.so`)。 5. **加载库文件**: 在Java程序中加载动态链接库,可以通过`System.loadLibrary()`方法指定库文件名。 ```java public class ...
5. **编译C/C++代码**:使用C/C++编译器(如GCC)将源代码编译为动态链接库(Windows上是.dll,Linux上是.so,Mac上是.dylib)。确保链接时包含JVM的库。 6. **运行Java程序**:最后,你可以在Java程序中调用`...
3. **编译并链接**:编译C/C++源代码,并将其链接成动态链接库(Windows下为.dll,Linux/Unix下为.so)。 4. **复制库文件**:将生成的动态链接库复制到Java程序的运行路径下。 5. **调用本地方法**:在Java程序中...
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
Java 调用DLL(动态链接库)主要是通过JNI(Java Native Interface)技术来实现的。JNI是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。在本例中,我们将详细介绍如何使用JNI调用C或C++编写的DLL...
这将生成一个动态链接库`libnative-lib.so`。 7. **运行Java程序** 将生成的本地库与Java类一起打包成jar文件,然后在Java程序中加载这个库,就可以调用本地方法了。例如: ```java public class Main { ...
4. **构建动态库**:使用合适的编译器(如Windows上的Visual Studio或Linux上的GCC)将C/C++源代码编译为动态链接库(如Windows上的`.dll`或Linux上的`.so`文件)。 5. **加载动态库**:在Java代码中,通过`System....
在Java编程环境中,有时我们需要利用C++编写的高性能或特定功能的库,这时可以借助Java的JNI(Java Native Interface)技术来调用C++编写的动态链接库(DLL)。本教程将详细介绍如何在Java中调用C++动态库,并通过...
本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...