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<jni.h>改成#include"jn.h"

然后开始写我们的cpp文件

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


#include "zsc_edu_lian_Mainclass.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_zsc_edu_lian_Mainclass_printHello(JNIEnv *env, jobject object)
{
	cout << "hello world" <<endl;
}

JNIEXPORT void JNICALL Java_zsc_edu_lian_Mainclass_main(JNIEnv *env, jclass clazz, jobjectArray objctaarray)
{	
	jmethodID mid = env->GetMethodID(clazz,"<init>","()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,"<init>","()V");可以得到构造函数,这里有点类似java中的反射,我给了你一份字节
码信息,那么我就可以通过对字节码信息进行查询中的<init>信息,接着就可以调用该方法,这是比较形象化的理解。
下面的方法就应该比较好理解的吧,
jobject me = env->NewObject(clazz,mid,NULL);知道了clazz和方法的jmethodID,那么就可以创建出对象出来
了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值