filed in java post by onelong on2010-8-29 16:30 Sunday
java代码如下:
//HelloWorld.java
public class HelloWorld{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
javac HelloWorld.java 编译文件
javah HelloWorld 生成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: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
新建并编写 HelloWorld.c,内容如下:
#include
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject job)
{
printf("Hello world!\n");
}
接下来就是编译啦!问题也跟着来了!
编译命令:注意-》gcc -I /usr/lib/jvm/java-6-sun/include -I /usr/lib/jvm/java-6-sun/include/linux -fPIC -shared -o libhello.so HelloWorld.c
不要使用-c参数!否则会出错的!什么错误呢?
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/hl/libhello.so: /home/hl/libhello.so: only ET_DYN and ET_EXEC can be loaded
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at HelloWorld.(Helloworld.java:7)
Could not find the main class: HelloWorld. Program will exit.
接下来就是运行了!这个也是问题多多的环节:
java Helloworld
java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:992)
at HelloWorld.main(HelloWorld.java:17)
系统提示,找不到了库!怎样解决呢?修改环境变量
在你的主目录(我的是/home/hl)找到.bashrc文件编辑它(ls -a)
添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hl
其中/home/hl是你想设定的路径,用于放库文件的目录。
hl@hl-desktop:~$ env
看看你设定的环境变量存不存在!如果存在就ok了!
LD_LIBRARY_PATH=:/home/hl
把生成的libhello.so文件复制到你你设定的路径接下来运行!
java Hello world
结果出来了!!
Hello world!
一个完整的Hello world也完成了!但是还是想多说点!
注意:一定要将linux下的动态库(共享库)命名成libxxx.so的形式,"xxx"是你在System.loadLibrary("xxx")中用到的加载库名称。
和gcc 怎样生成动态的库命令!这里不多说了!