干活前先把流程理清楚,先把工作场景,分析步骤
1.创建一个本地方法的java定义(就是native方法定义)
2.将java定义转化成c定义(c定义就是.h文件,就是头文件,头文件其实就是将各个.c文件中重复的声明、宏定义等提取出来放进一个文件中,便于其他.c文件共用这部分的代码)
3.实现c定义(.c文件引用c定义,然后将c定义中的方法实现了)
4.将c实现转化成链接库
5.加载链接库,调用本地方法触发链接库的实现
先查看本地方法的类,步骤1
public class NativeUtils {
public native int max(int i, int y);
}
编译生成字节码文件:javac NativeUtils.java,目录下多了.class文件,步骤2
编译生成头文件:javah NativeUtils,目录下多了.h文件
查看头文件
#include#ifndef _Included_NativeUtils #define _Included_NativeUtils #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_NativeUtils_max (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif
我们能发现其实就是定义了一个方法:Java_NativeUtils_max
实现头文件中定义的方法,步骤3
接下来写实现这个头包含的方法NativeUtilsImpl.c(注意要添加参数名,下面是env、obj、i、j)
#include#include #include"NativeUtils.h" JNIEXPORT jint JNICALL Java_NativeUtils_max (JNIEnv * env, jobject obj, jint i, jint j){ int k = (i>j)?i:j; printf("max : %d n",k); return k; }
执行命令生成链接库,步骤4
gcc -I [jdk目录]/include -I [jdk目录]/include/linux/ -fPIC -shared -o NativeUtilsImpl.so NativeUtilsImpl.c
生成链接库文件:NativeUtilsImpl.so
创建测试类,步骤5
public class TestNative {
static {
System.load("NativeUtilsImpl.so完整路径");
}
public static void main(String[] args) {
System.out.println("result : " +
new NativeUtils().max(
Integer.valueOf(args[0]), Integer.valueOf(args[1])));
}
}
编译执行(max是c的输出,result是java的输出)
javac TestNative.java
java TestNative 1 5 输出 max : 5 result : 5
java TestNative 7 5 输出 max : 7 result : 7



