工作上用到了JNI,完全不知道这是,查了下资料,总结下。
JNI,全名是Java Native Interface的缩写,中午名Java本地接口。
JNI的作用就是JAVA和其他语言的交互,其他语言可以调用JAVA相关环境,JAVA也可以用JNI技术来调用其他语言来弥补自身的不足,例如访问系统底层。
下面是一些关于JNI的代码。
JniMethodInfo t;
if(JniHelper::getStaticMethodInfo(t, (string(CLASS_NAME)+string("GameJniHelper")).c_str(),"doLogin","(I)V"))
{
jstring juid = t.env->NewStringUTF(uid); //生成一个jstring类型的方法转换
t.env->CallStaticVoidMethod(t.classID, t.methodID, uid);
t.env->DeleteLocalRef(t.classID);
}
JniMethodInfo是一个结构体,如下 typedef struct JniMethodInfo_ { //JNIEnv类型代表Java环境。通过这个JNIEnv*指针,就可以对Java端的代码进行操作。如,创建Java类得对象,调用Java对象的方 //法,获取Java对象的属性等。 JNIEnv * env; jclass classID; //这个变量的类型应该是自定义类型,因为在后面的释放要进行释放(猜测) jmethodID methodID; //这个变量是一个系统类型,类似于int这种,因为在后面没有对这个变量进行释放(猜测) } JniMethodInfo;JniHelper::getStaticMethodInfo(),如果一切正常这个getStaticMethodInfo会返回真,并且初始化JniMethodInfo结构体
函数原型是 bool JniHelper::getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);NewStringUTF方法就是生成一个jstring类型的字符串。具体关于JNI的类型在文章最后发的链接文章中查看。
CallStaticObjectMethod()调用java函数,并把返回值赋值给activityObj(jobject activityObj;).这个方法是可以有返回值的,返回值是一个jobect对象,具体干啥的还不清楚。
DeleteLocalRef()就是释放引用。大概意思是这样:在普通函数中,定义在函数中的变量会成为局部变量,会自动释放,而在JNI中定义的变量不会,会保存下来,如果不释放的话相当于每次运行都重新定义了,最后造成内存泄漏。具体实现见文章末尾的链接。类似于int这种基本类型不用调用这个函数,如果是string或者自定义类型需要调用这个函数来进行清理。
上面的代码大概运行过程是这样 的:先定义一个变量,然后调用JniHelper::getStaticMethodInfo()函数来进行初始定义的变量,并返回一个值用来判断是否正常。然后在这if语句里定义几个局部变量(但实质不是局部变量),然后在JAVA代码中调用相应的方法,根据JniHelper::getStaticMethodInfo()函数中的参数。最后清理变量。
******************************************************************************************************************
GameJniHelper.nativeSetPUid(mUid);
GameJniHelper.nativeSetPName(mName);
在JAVA代码有这么几行。解释:在Java里面用Native修饰的方法由另外一种语言实现的本地方法,意思就是说,这个用native修饰的方法在Java里面只能看到声明看不到定义。
在java中的原型大概是这样的:
public staticnativevoid nativeSetPUid(String value);
public staticnativevoid nativeSetPName(String value);
在C++中大概是这样的:
JNIEXPORT void JNICALL define_native_function(PACKAGE_NAME, GameJniHelper_nativeSetPUid)
(JNIEnv *env, jobject thiz, jstring value)
{
char *tmp = jstringToChar(env, value);
MiscValue::puid = tmp;
free(tmp);
}
参考文章:
http://blog.csdn.net/u013517637/article/details/53906201
http://blog.csdn.net/itachi85/article/details/8532977
强调一下:很多东西都是从这两篇文章复制而来的,我只是根据自己的习惯整理了一下。