Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • ubuntu10.04 调试 jni

    post by onelong / 2010-8-29 22:30 Sunday [java]

    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 <jni.h>
    /* 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 <stdio.h>
    #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.<clinit>(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 怎样生成动态的库命令!这里不多说了!

    引用地址:
     

    我要评论