我们下一步需要做的是利用平台已有的编译工具在命令行窗口编译该文件,如:
Linux:gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c
Windows: c1 -I jdk/include -I jdk/include/win32 -LD HelloNative.c -FeHelloNative.dll (也可以通过VC的IDE完成)
生成动态库文件之后,需要将其拷贝到path(win32)或LD_LIBRARY_PATH(Linux)环境变量包含的目录下,以便于执行时操作系统可以定位到该动态库,也可以将当前动态库所在的目录添加到path(win32)或LD_LIBRARY_PATH(Linux)中。
最后一步我们需要做的是实现调用该本地方法的Java代码,如:
1 package mytest;
2 public class MyTest {
3 //这里调用loadLibrary方法用于加载该动态库到JVM中,以保证在使用时该方法已经被加载。
4 static {
5 System.loadLibrary(\"HelloNative\");
6 }
7 public static void main(String[] args) throws Exception {
8 HelloNative.greeting();
9 }
10 }
11 /* 输出结果如下:
12 Hello, Native World!
13 */
2. 带有数值类型参数和返回值的本地方法:
先介绍一下Java中原始类型和C语言(JNI)中原始类型之间的对照关系,以及他们所占有的字节数量:
Java语言 C语言 字节数量
boolean jboolean 1
byte jbyte 1
char jchar 2
short jshort 2
int jint 4
long jlong 8
float jfloat 4
double jdouble 8
1) 编写带有native方法的Java代码:
1 package mytest;
2 public class Printf {
3 public static native int print(int width,int precision,double x);
4 static {
5 System.loadLibrary(\"Printf\");
6 }
7 }
2) 编写与native方法对应的C语言代码:(记着先执行命令行命令javah mytest.Printf来生成mytest_Printf.h头文件)
1 #include \"mytest_Printf.h\"
2 #include <stdio.h>
3 JNIEXPORT jint JNICALL Java_mytest_Printf_print(JNIEnv* env, jclass cl
4 ,jint width, jint precision, jdouble x)
5 {
6 char fmt[30];
7 jint ret;
8 sprintf(fmt,\"%%%d.%df\",width,precision);
9 ret = printf(fmt,x);
10 fflush(stdout);
11 return ret;
12 }
3) 编写调用native方法的Java测试代码:
1 package mytest;
2 public