linux环境java如何调用so文件 (linux jni)

用JNI实现

实例:

创建HelloWorld.java

class HelloWorld

{

private native void print();

public staticvoid main(String args)

{

new HelloWorld().print();

}

static

{

System.loadLibrary(“HelloWorld”);

}

}

注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码历喊祥段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。

编译HelloWorld.java

命令行

中运行如下命令:

javac HelloWorld.java

在当前

文件夹

编译生成HelloWorld.class。

生成HelloWorld.h

在命令行中运行如下命令:

javah -jni HelloWorld

在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:

/* DO NOT EDIT THIS FILE – it is machine generated */

#include

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern “C” {

#endif

/*

* Class: HelloWorld

* Method: print

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_print

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。

实现HelloWorld.c

创建HelloWorld.c文件渗信输入如下的代码:

#include

#include

#include “HelloWorld.h”

JNIEXPORT void JNICALL

Java_HelloWorld_print(JNIEnv *env, jobject obj)

{

printf(“Hello World!\n”);

}

注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,

宏定义

等。

另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。

env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。

obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。

编译生成libHelloWorld.so

在Linux下执行如下命令来完成编译工作:

cc -I/usr/lib/jvm/java-6-sun/include/linux/

-I/usr/lib/jvm/java-6-sun/include/

-fPIC -shared -o libHelloWorld.so HelloWorld.c

在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。

另外一个值得注意的是在HelloWorld.java中我们肢搏LoadLibrary方法加载的是

“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库

名+.so。链接的时候只需要提供库名就可以了。

运行Java程序HelloWorld

大功告成最后一步,验证前面的成果的时刻到了:

java HelloWorld

如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:

java -Djava.library.path=’.’ HelloWorld

当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。

我们可以看到久违的“Hello world!”输出了。

相关问题拓展阅读:

linux 中怎么设置java

1.首先要去下载好JDK,Java SE 8的官方网址是

根据自己的系统版本来选择是要使用32位版还是64位版。Linux提供了两种安装方式一个是.rpm,另一个是.tar.gz,我所使用的是.tar.gz。在下载前不要忘了选择Accept License Agreement。

2.可以使用下面的命令来查看自己的系统是32位还是64位

getconf LONG_BIT

3.接下来我们对下载的文件进行解压

tar -zxvf jdk-8u102-linux-x64.tar.gz

4.然后我们来新建一个目录,并将解压好的文件移动过去

mkdir /usr/java

mv ./jdk1.8.0_102 /usr/java

5.然后我们来设置环境变量,这里我们需要修改/etc/profile文件

先用vim打开/etc/profile文件

vim /etc/profile

6.在文件最后添加下面的内容

JAVA_HOME=/usr/java/jdk1.8.0_102

export JRE_HOME=/usr/java/jdk1.8.0_102/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

其中的jdk1.8.0_102请根据自己的实际文件名作出更改

添加完成后,保存并退出。最后一步便是重启计算机。

reboot

计算机重启后我们可以在终端中输入java来检测是否配置成功

java

如果配置成功便会显示提示信息

用法: java class

(执行类)

或 java -jar jarfile

(执行 jar 文件)

其中选项包括:

-d32 使用 32 位数据模型 (如果可用)

-d64 使用 64 位数据模型 (如果可用)

-server 选择 “server” VM

默认 VM 是 server,

因为您是在服务器类计算机上运行。判如

-cp

-classpath

用 : 分隔的目录, JAR 档案

和 ZIP 档案列表, 用于搜索类文件。

-D=

设置系统属性

-verbose:

启用详细输出

-version 输出产品版本并退出

-version:

警告: 此功能已过时, 将在

未来发行版中删除。

需要指定的版本才能运行

-showversion 输出产品版本并继续

-jre-restrict-search | -no-jre-restrict-search

警告: 此功能已过时, 将在

未来发行版中删除。

在版本搜索中包括/排除用户专用 JRE

-? -help 输出此帮助消息

-X输出非标准选项的帮助

-ea

-enableassertions

按指定的粒度启用断言

-da

-disableassertions

禁用具有猛拆指定粒度的断言

-esa | -enablesystemassertions

启用系统断言

-dsa | -disablesystemassertions

禁用系统断言

-agentlib:

加载本机代理库 , 例如 -agentlib:hprof

另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help

-agentpath:

按完整路径名加载本机代理库

-javaagent:

加载 Java 编程语言代理, 请参阅 java.lang.instrument

-splash:

使用指定的图像显示启动屏幕

三种配置环境变量的方法

1. 修改/etc/profile文件 

如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。 

·用文本则友编辑器打开/etc/profile 

·在profile文件末尾加入: 

export JAVA_HOME=/usr/share/jdk1.6.0_14

export PATH=$JAVA_HOME/bin:$PATH 

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录或执行 sudo source /etc/profile

·注解 

a. 假设你要将 /usr/share/jdk1.6.0_14改为你的jdk安装目录 

b. linux下用冒号“:”来分隔烂弯路径 

c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值 

在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种 

常见的错误。 

d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。 

e. export是把这三个变量导出为全局变量。 

f. 大小写必须严格区分。 

2. 修改.bash_profile文件 

这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bash_profile文件就可以了。 

·用文本编辑器打开用户目录下的.bash_profile文件 

·在.bash_profile文件末尾加入: 

export JAVA_HOME=/usr/share/jdk1.6.0_14 

export PATH=$JAVA_HOME/bin:$PATH 

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录或执行source ~/.bash_profile

3. 直接在shell下设置变量 

不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。 

只需在shell终端执行下列命令: 

export JAVA_HOME=/usr/share/jdk1.6.0_14 

export PATH=$JAVA_HOME/bin:$PATH 

export 饥盯闷CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Linux下Java安装与配置

以JDK1.6.0_43为例介绍一下如何在linux中设置java

1. 下载销顷jdk-6u43-linux-x64.bin,

增加可执行权伍斗旦限 chmod +x jdk-6u43-linux-x64.bin,

执行 ./jdk-6u43-linux-x64.bin 生成目录jdk1.6.0_43

拷贝到/usr/share下,mv jdk1.6.0_43 /usr/share

另外,jdk-6u43-linux-x64.bin将所有文件解压缩到当前目录的腔扰jdk$verison_$update目录,

jdk-6u43-linux-x64-rpm.bin解压缩生成rpm包,用rpm -ivh命令安装

 

2. 配置环境变量

在/etc/profile下增加

# set Java environment

JAVA_HOME=/usr/share/jdk1.6.0_43

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME

export PATH

export CLASSPATH

 

3. 测试

# echo $JAVA_HOME

/usr/share/jdk1.6.0_43

# echo $PATH

/usr/share/jdk1.6.0_43/bin:/usr/lib64/qt-3.3/bin:/usr/local/in:/usr/local/bin:/in:/bin:/usr/in:/usr/bin:/root/bin

# echo $CLASSPATH

.:/usr/share/jdk1.6.0_43/lib/dt.jar:/usr/share/jdk1.6.0_43/lib/tools.jar

# java -version

java version “1.6.0_43”

Java(TM) SE Runtime Environment (build 1.6.0_43-b01)

Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)

1、如果你的linux服务器不会重启,或者一次性使用java,可以直接在shell内依次输辩启入一下几条命令:

 export JAVA_HOME=/usr/share/jdk1.8.0_71 

export PATH=$JAVA_HOME/bin:$PATH 

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

2、如果考虑到长久使用,且机器有可能会被重启掉,那么使用以下方法:

 打开/etc/profile(用vi或简灶含者其他你自己拦笑喜欢的文本编辑器)

在文件末尾添加如下语句:

JAVA_HOME=/usr/java/default

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME

export PATH

export CLASSPATH

linux上安装java后主要需要设运闷置两个地方

JAVA_HOME, apt/yum安装的jdk通常在/usr/lib/jvm下, 如/usr/lib/jvm/java-8-openjdk-amd64, mvn之类的工具依赖JAVA_HOME环境变量

PATH, 需要确保$JAVA_HOME/bin在PATH中

配置文件修改, 通常可以修改~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export PATH=$JAVA_HOME/bin:$PATH

要对所有用户生效可以编旁埋弯辑/etc/profile.d/java.sh, 添加

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export PATH=$JAVA_HOME/bin:$PATH

关于linux jni的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » linux环境java如何调用so文件 (linux jni)