请先配置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程序中加载该类库。