JNI是Java Native Interface的缩写,JAVA本地调用。从jdk1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。看过JDK源代码的人肯定会注意到在源码里有很多标记成native的方法。这些个方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。他提供了一个调用(invoke)的接口,然后用C或者C++去实现;
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
GCC:(GNU Compiler Collection,GNU编译器套装)是一套支持多种编程语言的编译器。GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。GCC原名为GNU C编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,并支持处理C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go等。
GCC编译后缀名:
.c为后缀的文件,C语言源代码文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
C编译后缀名:
头文件后缀名: .h
源文件后缀名: .c
C++编译后缀名:
头文件后缀名: .h, .hpp, .hxx
源文件后缀名:.cpp, .cc, .cxx, .C .c++
新建项目JNI
package org.nickfover.jni; public class Demo1 { public native void say(String str); }
E:\ECLIPSEWORKPALCE\JNI\src>javac org/nickfover/jni/Demo1.java
E:\ECLIPSEWORKPALCE\JNI\src>javah org.nickfover.jni.Demo1
返回src目录:
打开c++开发工具VC 6,新建一个Win32 Dynamic-Link library项目,取名为JAVAJNI;
将org_nickfover_jni_Demo1.h文件拷贝到这个工程目录下;将<jni.h>修改为"jni.h"
在项目里新建一个c++source file ,内容如下:
#include <iostream.h> #include "org_nickfover_jni_Demo1.h" JNIEXPORT void JNICALL Java_org_nickfover_jni_Demo1_say (JNIEnv *, jobject, jstring) { cout << "Hello, " << endl; }
效果图:
这时编译会报错,将*/java/include下的jni.h和jni_md.h也拷贝到工程目录下:
现在执行编译build(F7); 在debug目录就会生成一个JAVAJNI.dll文件;现在将这个文件拷贝到java库中;
1、查看java库:
System.out.println( System.getProperty("java.library.path"));
列出了一些java的库,拷贝到其中的一个;比如我拷贝到:D:\ZmyExe\java\bin\JAVAJNI.dll
2.测试:
package org.nickfover.jni; public class Demo1 { static{ System.loadLibrary("JAVAJNI"); //加载dll文件 } public native void say(String s); public static void main(String[] str){ new Demo1().say("1"); } }
输出:
Hello,
调用dll文件成功;
也可以直接将JAVAJNI.dll文件放在java工程目录下:
传递参数需要了解数据类型在内存中的表示,后跟进