JNI的一些解释

xiaoxiao2021-02-27  221

工作上用到了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

强调一下:很多东西都是从这两篇文章复制而来的,我只是根据自己的习惯整理了一下。

转载请注明原文地址: https://www.6miu.com/read-13518.html

最新回复(0)