請先配置Java環境...
1.創建Java文件Hello.java
public class Hello{
public native void HelloWorld();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new Hello().HelloWorld();
}
}
2.編輯Java
javac Hello.java
3.生成java頭文件
javah -jni Hello
[root@BigData116 tools]# ls
Hello.class Hello.h Hello.java
多了一個.h 文件
4. more Hello.h
[root@BigData116 tools]# more Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: HelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_HelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
5.編輯c文件
[root@BigData116 tools]# touch Hello.c
[root@BigData116 tools]# vi Hello.c
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"
#include "Hello.h"
JNIEXPORT void JNICALL JNICALL Java_Hello_HelloWorld (JNIEnv *env, jobject obj)
{
printf("hello world ,i am from Hello.c");
}
6.-fPIC
選項作用於編譯階段,告訴編譯器產生與位置無關代碼
gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -c Hello.c
[root@BigData116 tools]# ls
Hello.c Hello.class Hello.h Hello.java Hello.o
多了個.o 文件
7.生成共享庫格式.
動態鏈接文件稱爲動態共享對象 (Dynamic Shared Objects,DSO),一般是以 .so
爲擴展名的文件
[root@BigData116 tools]# gcc -shared Hello.o -o libhello.so
8.運行測試
[root@BigData116 tools]# java Hello
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Hello.<clinit>(Hello.java:4)
設置library 環境 bash_profile
export LD_LIBRARY_PATH=/root/tools
使環境生效
source ~/.bash_profile
運行 java Hello
[root@BigData116 tools]# java Hello
hello world ,i am from Hello.c
總的來說,將一個本地方法鏈接到Java程序中需要經過以下5個步驟:
- 在Java類中聲明一個本地方法;
- 運行javah以獲得包含該方法的C聲明的頭文件;
- 用C實現該本地方法;
- 將代碼置於共享類庫中;
- 在Java程序中加載該類庫。