Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5443651
  • 博文数量: 895
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8691
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(895)

文章存档

2021年(2)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Java

2012-03-03 18:33:40

filed in post by 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是你想设定的路径,用于放库文件的目录。
env
看看你设定的环境变量存不存在!如果存在就ok了!
LD_LIBRARY_PATH=:/home/hl
把生成的libhello.so文件复制到你你设定的路径接下来运行!

java Hello world
结果出来了!!
Hello world!
一个完整的Hello world也完成了!但是还是想多说点!
注意:一定要将linux下的动态库(共享库)命名成libxxx.so的形式,"xxx"是你在System.loadLibrary("xxx")中用到的加载库名称。
和gcc 怎样生成动态的库命令!这里不多说了!

阅读(2624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~