OS:
3.2.0-33-generic-pae #52-Ubuntu SMP Thu Oct 18 16:39:21 UTC 2012 i686 i686 i386 GNU/Linux
1, 编写正常的Java代码,将需要用native code编写的方法声明为native:
class HelloWorld
{
//load the library, the library's name should be libhello.so under linux
{
System.loadLibrary("hello");以下
}
// native method
public native void sayHello();
// normal method
public void sayWorld()
{
System.out.println("World!");
}
}
2,编译代码:
javac HelloWorld
生成HelloWorld.class文件
3,用javah -jni命令生成C的头文件 HelloWorld.h :
javah -jni HelloWorld
HelloWorld.h 的内容如下
/* 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: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
一些比较老的文章还要求用
javah -stubs HelloWorld
来生成头文件。现在,这个应该是不需要的。
4, 编写相应的C文件 HelloWorld.c :
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv *env, jobject obj)
{
printf("Hello!\n");
}
5,编译生成动态链接库文件libhello.so:
gcc -shared -fpic -I/opt/java/include -o libhello.so HelloWorld.c
6,将生成的.so文件复制到系统的库文件目录
cp libhello.so /usr/lib
7, 测试
class Test
{
public static void main(String[] args)
{
HelloWorld hw = new HelloWorld();
hw.sayHello();
hw.sayWorld();
}
}
javac Test.java
java Test
输出的结果是:
Hello!
World!
参考:
http://www.java-tips.org/other-api-tips/jni/simple-example-of-using-the-java-native-interface.html
https://blogs.oracle.com/moonocean/entry/a_simple_example_of_jni