红联Linux门户
Linux帮助

我的第一个Linux下的JNI程序

发布时间:2015-12-12 10:00:37来源:linux网站作者:全速前行

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


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


Linux下JNI简单实现过程:http://www.linuxdiyf.com/linux/14903.html

Android Studio下进行jni开发及打包方法:http://www.linuxdiyf.com/linux/12069.html