用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 <jni.h>
/* 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 <jni.h>
#include <stdio.h>
#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程序使用访
从命令行或者 shell 提示符执行应用程序的一个常用方法是使用 ./ 命令。如果您在 Linux 中使用句号 (.) 和正斜杠 (/),就意味着告诉环境您想要以可执行文件运行该文件。例如,运行一个名为 myapp 的可执行文件,您可以使用 ./myapp 命令。
‘叁’ 如何在Linux环境下调试Java程序使用访问Timesten
一、新建本地java工程
file->new->java project
二、添加jar包和配置文件
1、添加JAR包
右击Propertie在弹出的快捷菜单中选择Java Build Path对话框,在该对话框中单击Libraries选项卡,在该选项卡下单击
Add External JARs按钮,定位到$HBASE/lib目录下,并选取如下JAR包。
hadoop-core-1.0.0.jar
commons-loggings-version.jar
commons-cli-version.jar
commons-lang-version.jar
commons-configuration-version.jar
hbase-0.94.1.jar
zookeeper-3.4.3.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.16.jar
protobuf-java-2.4.1.jar
2、添加hbase-site.xml配置文件
在工程根目录下创建conf文件夹,将$HBASE_HOME/conf/目录中的hbase-site.xml文件复制到该文件夹中。通过右键
选择Propertie->Java Build Path->Libraries->Add Class Folder。
3、windows下开发HBase应用程序,HBase部署在linux环境中,在运行调试时可能会出现无法找到主机,类似异常信息如下:java.net.UnknownHostException: unknown host: master
解决办法如下:在C:\WINDOWS\system32\drivers\etc\hosts文件中添加如下信息
192.168.2.34 master
‘肆’ 如何在linux上自动运行java程序
java 你的文件.class
就可以运行你的程序了,你可以把它加到脚本中
‘伍’ java在linux环境下的配置
纯java开发的软件在linux下面也可以应用自如。那么首先就需要配置好linux下的java环境,具体说来,就是配置jdk环境变量。
介绍在linux下配置jdk环境变量的几种常用方法。
首先在linux下安装jdk,如果出现提示权限不够(且root下也提示权限不够),可用#ls -l filename命令查看一下,如果显示类似如:
则表示任何用户都没有可执行权限(即使是root用户)。
解决方法:
#chmod a+x filename
这样,安装好后,就可以接下来进行环境变量的配置了。这里给出三种可选方法:
一、修改/etc/profile文件
当本机仅仅作为开发使用时推荐使用这种方法,因为此种配置时所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。
用文本编辑器打开/etc/profile,在profile文件末尾加入:
JAVA_HOME=/usr/share/jdk1.5.0_05
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
重新登录即可。
二、修改.bashrc文件
这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果需要给某个用户权限使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。
用文本编辑器打开用户目录下的.bashrc文件,在.bashrc文件末尾加入:
set JAVA_HOME=/usr/share/jdk1.5.0_05
export JAVA_HOME
set PATH=$JAVA_HOME/bin:$PATH
export PATH
set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH
重新登录。
三、直接在shell下设置变量
不推荐使用这种方法,因为换个shell,该设置就无效了。这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。
只需在shell终端执行下列命令:
export JAVA_HOME=/usr/share/jdk1.5.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
注意:
1.要将 /usr/share/jdk1.5.0_05jdk 改为jdk安装目录
2. linux下用冒号”:”来分隔路径
3. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值在设置环境变量时特别要注意不能把原来的值给覆盖掉了。
4. CLASSPATH中当前目录”.”不能丢掉。
5. export是把这三个变量导出为全局变量。
6. 大小写必须严格区分。
(引用资料,仅作交流)
‘陆’ 如何在Linux环境下调试Java程序使用访问Timesten
首先要安装JDK,再要配制环境变量,以下以Bash shell为例 在终端下用VI打开配置文件,方法:vi .bash_profile;按i键进入到插入模式,不要改变原文件,添加$JAVA_HOME=JDK 的安装路径如/opt/jdk
‘柒’ 如何在linux下调试Java system.loadlibrary错误
1. 我认为这个问题是与调用System.loadLibrary(字符串)LD_LIBRARY_PATH。使用LoadLibrary(“富”)将看着你的java.library.path的libfoo.so。如果发现任何libfoo.so你会得到这个错误。 现在,如果你只设置了LD_LIBRARY_PATH,你想要的原始符号将自动被拾起的连接器,所以你不需要设置-Djava.library.path。 在我的经验与swig在GDAL项目,这个错误其实是无害的,因为LD_LIBRARY_PATH设置,这将正常工作。 我会使用-Djava.library.path和调用调用LoadLibrary explitly CodeGo.net,原因是,如果你决定要使用的webstart部署你的应用程序,你将需要显式地调用LoadLibrary来让你的本地库拾起。 当月食我遵循达夫给您编辑在构建路径Libraries选项卡下的jar本地库的说明。只需再次,这只是设置在幕后java.library.path。
2. 你可以试试-Djava.library.path=actual.so行吧? 在Windows上,我也有类似的问题,第三方库,JNI封装的DLL,它的DLL。我的项目已经在lib目录下的DLL,这样我添加到库的路径(如:PATH=%PATH%;./lib变,一切都开始工作。
3. 据我知道的Eclipse没有关系'的LD_LIBRARY_PATH。 要树立正确的本地库路径的最简单的方法就是去 项目属性-> Java构建路径->库 然后展开或者JRE的系统库条目或(如果有的话)的 jar文件的本地库, 选择“本地库位置”,然后单击“编辑...”并选择你的库。实际上它并设置-Djava.library.path变量,以便你必须包括这行,如果你开始从外面蚀你的程序的文件夹。
4. 这可能是因为你只需要找到运行配置对话框中合适的地方放-Djava.library.path=...选项。随口说说我想你想-D在选项卡上的“VM定义,而如果要定义LD_LIBRARY_PATH就是那张在标签上。Eclipse的让你把东西在那里他们赢得'你觉得什么反正我库这样的地方以前,如果我有机会,我会仰望我做了什么,在这里编辑我的答案。 另一件事,试图与LD_DEBUG玩。您可以设置变量LD_DEBUG的事情(尝试所有),然后Linux加载程序会泄露的各种关于什么一个应用程序试图加载,它在寻找的东西,等等。当然,这种预先假定您启动Eclipse从行,所以你可以同时设置ENV增值经销商,看到了loader的诊断,但就系统而言,当你从Eclipse中运行你的应用,你的应用程序仅仅是Eclipse是干什么的,所以任何的库装载行为cocoa见以这种方式。
5. 是否有你的两个库依赖于任何其他库?如果是这样,你需要确保他们也可以访问到JVM。 请注意,手动设置“-Djava.library.path”似乎清除预设的库路径。 所以,用下面的代码:public class LibTest {
public static void main(String[] args) {
String property = System.getProperty("java.library.path");
StringTokenizer parser = new StringTokenizer(property, ":");
while (parser.hasMoreTokens()) {
System.err.println(parser.nextToken());
}
}
}
从eclipse与Java 1.6.0_14输出启动:/opt/java/jre/lib/i386/client
/opt/java/jre/lib/i386
/opt/java/jre/../lib/i386
/opt/java/jre/lib/i386/client
/opt/java/jre/lib/i386
/usr/lib/xulrunner-devel-1.9.0.11
/usr/lib/xulrunner-devel-1.9.0.11
/usr/java/packages/lib/i386
/lib
/usr/lib
但是,当我设置的JVM ARG“-Djava.library.path=/ tmp目录/”我只得到:/tmp/
如果您要手动设置java.library.path这也许可以解释为什么LDD的作品从行,但你的,所以不会从eclipse/ java的。 你可以试试不设置,而不是调用System.loadLibrary java.library.path System.load的绝对路径到库中。这可能使JVM能够找到你,所以,默认的路径寻找它的依赖时。 当然,如果这是,那么你也可以尝试打开JNI调试输出与“-verbose:当使用JNI”上线。这可能给您的线索来解决问题。
6. 是LD_LIBRARY_PATH环境工作
7. 加入这个答案可能是它可以在AIX机器,我们需要设置LIBPATH变量,而不是LD_LIBRARY_PATH。
‘捌’ java怎么调用linux的命令怎么输入一条命令让linux用终端运行,然后获得返回的文本
用java的process类了。
process这个类是一个抽象类,封装了一个进程(你在调用linux的命令或者shell脚本就是为了执行一个在linux下执行的程序,所以应该使用process类)。
process类提供了执行从进程输入,执行输出到进程,等待进程完成,检查进程的推出状态,以及shut down掉进程。
‘玖’ 关于Linux下的java编程
[root@linux
root]#
vi
/etc/profile
export
JAVA_HOME=/usr/java/j2sdk1.4.2_04
←修改成你自己的版本
export
PATH=$PATH:$JAVA_HOME/bin
export
CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@linux
root]#
source
/etc/profile
以上是设置环境变量.
[root@linux
root]#
vi
HelloWorld.java
public
class
HelloWorld
{
public
static
void
main(String[]
args)
{
System.out.println("Hello
World");
}
}
写个小程序.
[root@linux
root]#
javac
HelloWorld.java
←
编译
[root@linux
root]#
ls
-al
合计
16
-rw-rw-r--
1
fedora
fedora
425
3月
11
22:22
HelloWorld.class
←作成了
-rw-rw-r--
1
fedora
fedora
115
3月
11
22:22
HelloWorld.java
[root@linux
root]#
java
HelloWorld
Hello
World
満意吗?
‘拾’ 如何在linux终端运行java
Linux终端下运行Java程序,需要安装JDK。
这里先介绍如何安装JDK,然后介绍如何安装Java程序。
首先,打开终端,快捷键ctrl+alt+t;
安装JDK,sudo apt-get install openjdk-7-jdk( 注意,这里需要输入密码);
切换到java程序所在的目录;
编译以.java结尾的程序,可以使用javac *.java编译当前目录下所有的java源程序,并生成相应的class文件;
假如含有主程序的类文件是MP3.java,则使用java MP3运行该java程序。