一,在windows下生成dll动态链接库:
java文件:
public class JniEg {
//native 文件,只需声明不需要实现
public native void display();
public native double sum(double x,double y);
//static 静态代码块儿加载本地类库
static
{
System.loadLibrary("hello");//动态链接库的名字
}
public static void main(String args[])
{
//System.out.println("Hello,world!");
new JniEg().display();
System.out.println(new JniEg().sum(10.1,10.2));
}
}
用native关键字,说明方法display和sum用的是本地方法(非java)方法,这里用c实现display和sum:
首先将JniEg编译成.h文件:
1,编译JniEg为class文件 JniEg.class
2,用命令javah jniEg编译为头文件JniEg.h
JniEg.h文件为自动生成,如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniEg */
#ifndef _Included_JniEg
#define _Included_JniEg
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniEg
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JniEg_display
(JNIEnv *, jobject);
/*
* Class: JniEg
* Method: sum
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_JniEg_sum
(JNIEnv *, jobject, jdouble, jdouble);
#ifdef __cplusplus
}
#endif
#endif
然后实现方法display和sum
hello.c文件如下:
#include <jni.h>
#include "JniEg.h"
#include <stdio.h>
#include <stdlib.h>
JNIEXPORT void JNICALL Java_JniEg_display(JNIEnv *env, jobject obj)
{
printf("Hello,World!\n");
return;
}
JNIEXPORT jdouble JNICALL Java_JniEg_sum(JNIEnv *env, jobject obj, jdouble a, jdouble b)
{
return a + b;
}
然后编译为dll库:
用命令(用的是Mingw):
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o hello.dll hello.c
用-Wl,--kill-at因为mingw默认是用@来进行分隔,会导致JNI机制不能读取,所以要删掉..
将生产的dll文件放到eclipse的项目根目录里面,注意java找sum和display是用的类名找的,所以hello.dll只能被JniEg类来调用
编译运行。
二,在linux下生产.so库
java文件同上,生成.h文件同上,hello.c文件同上,不同的地方是在linux中的动态链接库的生成
1,首先要注意的第一点是,linux中默认的动态链接库的名字是lib开头的,也就是说,如果这里写的是System.loadLibrary(“hello”);则动态链接库的名字必须是:
libhello.so文件
2,在生成libhello.so文件时的命令:gcc -I/usr/java/jdk1.7.0/include -I/usr/java/jdk1.7.0/include/linux -o libhello.so -O2 -fPIC -shared hello.c
解释一下:-fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编译为共享库
注意这里如果要是编译命令为:gcc -I/usr/java/jdk1.7.0/include -I/usr/java/jdk1.7.0/include/linux -o libhello.so -O2 -fPIC -shared -c hello.c
多了一个-c就会出现:java.lang.UnsatisfiedLinkError: 动态库 : 动态库:only ET_DYN and ET_EXEC can be loaded错误。
最后注意将生成的libhello.so文件放到java默认查找的地方/usr/lib里面
或者用命令export LD_LIBRARY_PATH = .:$LD_LIBRARY_PATH