您的位置:首页 > 其它

getStaticMethodInfo参数详解

2017-08-11 09:01 316 查看
两个接口的参数一样,意义也相同,详解如下:

JniMethodInfo &methodinfo JniMethodInfo对象的引用,函数执行中会把jniEvn、classid、methodid写入到引用中。

const char *className 类的路径,把类的完整包名写全,用法如以上代码。

const char *methodName 函数名。

const char *paramCode 函数类型简写

这个参数需要单独介绍,它的格式为:(参数)返回类型。

例如:无参数,void返回类型函数,其简写为()V

java中的类型对应的简写如下:

参数类型 参数简写

boolean Z

byte B

char C

short S

int I

long J

float F

double D

void V

Object Ljava/lang/String; L用/分割类的完整路径

Array [Ljava/lang/String; [签名 [I

多参数的函数

如果函数有多个参数,直接把简写并列即可。注意Object与Array型参数简写结尾的分号,示例:

IIII //4个int型参数的函数

ILjava/lang/String;I //整形,string类型,整形组合(int x, String a, int y)

http://www.2cto.com/kf/201402/279085.html

 

1、JniHelper类里getStaticMethodInfo参数详解

getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode)

JniMethodInfo &methodinfo    JniMethodInfo对象的引用,函数执行中会把jniEvn、classid、methodid写入到引用中。

const char *className    类的路径,把类的完整包名写全,用法如以上代码。

const char *methodName    函数名,函数名写上就行了。

const char *paramCode   函数类型简写

这个参数需要单独介绍,它的格式为:(参数)返回类型。

例如:无参数,void返回类型函数,其简写为()V

Java中的类型对应的简写如下:

 

多参数的函数

如果函数有多个参数,直接把简写并列即可。注意Object与Array型参数简写结尾的分号,示例:

IIII //4个int型参数的函数

ILjava/lang/String;I //整形,string类型,整形组合(int x, String a, int y)

通过JNIEnv进行函数调用

JNIEvn有一系列的CallStatic[返回类型]Method、Call[返回类型]Method接口,需要针对不同的函数返回类型选择调用。

[返回类型]以函数返回类型的不同,对应不同的函数名。

例如:

CallStaticVoidMethod ———void

CallVoidMethod ———void

其对应关系如下:

 

 

参数传递

调用有参数的java函数时,需要把对应的参数传递进去。需要把参数按顺序加入到classid、methodid后面,并且需要做类型转换。例如:

jint jX = 10;

jint jY = 10;

minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jX, jY);

参数类型转换关系如下:

 

string类型的转换

实际上我们最常用的参数类型,主要是内建的数据类型、string字符串类型。数据类型可以直接转为j类型,但是string类型需要做如下处理:

jstring jmsg = minfo.env->NewStringUTF("http://www.baidu.com");

minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jmsg);

非静态函数的调用

非静态函数的调用与静态函数的调用类型,但是需要通过一个静态函数获取java类对象。

示例:

//C++代码

    //1. 获取activity静态对象

    JniMethodInfo minfo;

    bool isHave = JniHelper::getStaticMethodInfo(minfo,

                                      
4000
           "com/omega/MyApp",

                                                 "getJavaActivity",

                                                 "()Ljava/lang/Object;");

    jobject activityObj;

    if (isHave)

    {

        //调用静态函数getJavaActivity,获取java类对象。

        activityObj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);

    }

 

    //2. 查找displayWebView接口,获取其函数信息,并用jobj调用

    isHave = JniHelper::getMethodInfo(minfo,"com/omega/MyApp","displayWebView", "(IIII)V");

 

    if (!isHave)

    {

        CCLog("jni:displayWebView 函数不存在");

    }

    else

    {

        //调用此函数

        jint jX = (int)tlX;

        jint jY = (int)tlY;

        jint jWidth = (int)webWidth;

        jint jHeight = (int)webHeight;

        //调用displayWebView函数,并传入参数

        minfo.env->CallVoidMethod(activityObj, minfo.methodID, jX, jY, jWidth, jHeight);

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: