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