IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]我的第一个Linux下的JNI程序

    lincyang发表于 2011-06-06 20:34:00
    love 0

    这个程序很早就开始写了,但过程中遇到了太多小问题,磕磕绊绊的,到今天程序才算是跑起来。

     

    1、写Java源程序

     class HelloWorld {
         private native void print();
    
         public static void main(String[] args) {
             new HelloWorld().print();
         }
         static {
             System.loadLibrary("HelloWorld");
             
         }
     }


    本地函数是print,linux下,此库文件应该是libHelloWorld.so.

     

    2、编译并生成头文件

    javac HelloWorld.java
    
    javah HelloWorld


    生成的头文件为:

    /* 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


     

    3、C程序

    #include <jni.h>
    #include <stdio.h>
    #include "HelloWorld.h"
    
    JNIEXPORT void JNICALL 
    Java_HelloWorld_print(JNIEnv *env, jobject obj)
    {
    	printf("i am linc !!!\n");
    	return;
    }


     

    4、编写make文件(此文件没有后缀,就叫makefile)

    libHelloWorld.so:HelloWorld.o
    	gcc -rdynamic -shared -o libHelloWorld.so HelloWorld.o
    HelloWorld.o:HelloWorld.c HelloWorld.h
    	gcc -c HelloWorld.c -I./ -I/usr/java/jdk1.6.0_25/include -I/usr/java/jdk1.6.0_25/include/linux


     

    5、运行makefile,只要在makefile目录下,make回车就ok啦

    此时会生成libHelloWorld.so,按道理说,把此so文件放在java.class文件的目录,就可以正常运行了。

    但是我失败了。

    报错:java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

     

    最后的解决方法是这样,用如下

    public class LibPath {
    	public static void main(String args[]){  
    		  
    		System.out.println("Linc");  
    		System.out.println(System.getProperty("java.library.path"));  
    		  
    		}  
    }
    


    打印出lib目录,我这用到了/usr/java/jdk1.6.0_25/jre/lib/i386/server

    然后把so文件放入其中,就ok了。

    此间也遇到了没有权限的问题,我用root把此目录的权限给改了。

    现在可以向下进行JNI的学习了!!!

     



沪ICP备19023445号-2号
友情链接