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的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。