JAVA:1.8java
OS:ubuntu 16.04linux
--------ubuntu
在学习java的equals方法和hashcode方法的时候,了解到java的Object类的hashcode方法是一个native方法。初步了解了一点jni,也即JAVA native interface,经过jni可使用java调用本地其余程序等,这样虽然函数的声明是在java代码中,但函数的实现由其余语言(本身仅知道支持C,C++)实现。数据结构
1.首先写一个java的class函数
public class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("HelloWorldImpl"); System.out.println("HelloWorldImpl loaded!"); } public static void main(String[] args) { HelloWorld h = new HelloWorld(); h.displayHelloWorld(); } }
native方法的定义很简单,在函数名前加一个native就能够。学习
在static块中,使用System.loadLibrary,加载库,在Linux环境中,会加载LD_LIBRARY_PATH环境变量配置路径中的libHelloWorldImpl.so动态连接库,这是Linux的默认实现方法。spa
2.运行javac HelloWorld.java编译java类code
3.运行javah -jni HelloWorld生成HelloWorld.h头文件以下blog
/* 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: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
能够想象,JAVA自定义了一套c语言的数据结构和函数名规则,来使得java和c按照约定的规则进行调用。hash
4.编辑HelloWorldImpl.c文件,实现以下
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <stdio.h> #include "HelloWorld.h" /* Header for class HelloWorld */ /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *env, jobject jo) { printf("Hello World!\n"); return; }
jni.h在JDK安装路径中中,因此编译的时候,要加入头文件路径
gcc -I /usr/lib/java/jdk1.8.0_121/include -I /usr/lib/java/jdk1.8.0_121/include/linux -fPIC -shared -o libHelloWorldImpl.so HelloWorldImpl.c
5.这个时候能够运行程序了,前面说了,使用System.loadLibrary,加载库,在Linux环境中,会加载LD_LIBRARY_PATH环境变量配置路径中的libHelloWorldImpl.so动态连接库,运行方法1:设置LD_LIBRARY_PATH环境变量,运行java HelloWorld;运行方法二:java -Djava.library.path='.' HelloWorld