现在的位置: 首页 > 综合 > 正文

我的第一个Linux下的JNI程序

2013年01月10日 ⁄ 综合 ⁄ 共 1444字 ⁄ 字号 评论关闭

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

 

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的学习了!!!

 

抱歉!评论已关闭.