JNI入门一

阅读更多

JNI是什么,这里就不在都说了。使用JNI的好处就是可以在java中调用本地代码C/C++,可以方便java与其他语言进行调用,加快java的效率。坏处就是使用了JNI就不能跨平台了。

这里直接进入JNI。

java代码


package zsc.edu.lian;

public class Mainclass {
	
	static{
		System.loadLibrary("Test");
	}
	public native void printHello();
	
	public native static void main(String[] args) ;
}




 javah zsc.ed.lian.Mainclass一下,这时生成.h头文件。

然后启动vs2010,建立一个win32空项目,把.h文件,还有jdk中的include目录下的jni.h和jni_md.h复制到工程目录下。

把生产的.h文件中#include改成#include"jn.h"

然后开始写我们的cpp文件

下面是我的cpp.cpp文件的实现:


#include "zsc_edu_lian_Mainclass.h"
#include 
using namespace std;

JNIEXPORT void JNICALL Java_zsc_edu_lian_Mainclass_printHello(JNIEnv *env, jobject object)
{
	cout << "hello world" <GetMethodID(clazz,"","()V");//第二个参数
        方法名,第三个参数是方法的参数和返回值,这个可以使用javap -s classname
        进行查看。
        jobject me = env->NewObject(clazz,mid,NULL);
	mid = env->GetMethodID(clazz,"printHello","()V");
	env->CallVoidMethod(me,mid,NULL);
}


javap -s Mainclass
Compiled from "Mainclass.java"
public class zsc.edu.lian.Mainclass {
  static {};
    Signature: ()V

  public zsc.edu.lian.Mainclass();
    Signature: ()V

  public native void printHello();
    Signature: ()V

  public static native void main(java.lang.String[]);
    Signature: ([Ljava/lang/String;)V
}
 

 这里的JNIEnv *env可以想象成是JNI的一个运行的上下文环境,这里面定义了许多可以访问方法函数的方法,而jclass clazz虽然是一个类型,但是我把它理解成类似java中的Class,表示字节码,那么我们就可以通过调用env->GetMethodID(clazz,"","()V");可以得到构造函数,这里有点类似java中的反射,我给了你一份字节
码信息,那么我就可以通过对字节码信息进行查询中的信息,接着就可以调用该方法,这是比较形象化的理解。
下面的方法就应该比较好理解的吧,
jobject me = env->NewObject(clazz,mid,NULL);知道了clazz和方法的jmethodID,那么就可以创建出对象出来
了。

然后低该cpp.cpp 进行编译,然后在工程的DEBUG目录下就会有.dll文件,把这个文件的路径添加到系统环境变量中,
例如C:\Users\Administrator\Documents\Visual Studio 2010\Projects\Test\Debug
接着就重启ecplise,就可以运行了!

你可能感兴趣的:(JNI入门一)