JniHelper调用java静态和非静态方法总结(即cocos2dx中调用android平台下显示第三方广告)(二)

2014-11-24 07:25:48 · 作者: · 浏览: 1
;I //整形,string类型,整形组合 (int x, String a, int y)


通过JNIEnv进行函数调用
JNIEvn有一系列的CallStatic[返回类型]Method、Call[返回类型]Method接口,需要针对不同的函数返回类型选择调用。
[返回类型]以函数返回类型的不同,对应不同的函数名。
例如:
CallStaticVoidMethod ―――void
CallVoidMethod ―――void
其对应关系如下:


函数名 函数返回值类型
Void void
Object jobject
Boolean jboolean
Byte jbyte
Char jchar
Short jshort
Int jint
Long jlong
Float jfloat
Double jdouble
参数传递
调用有参数的java函数时,需要把对应的参数传递进去。需要把参数按顺序加入到classid、methodid后面,并且需要做类型转换。例如:


jint jX = 10;
jint jY = 10;
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jX, jY);
参数类型转换关系如下:


C++类型 JAVA类型
boolean jboolean
byte jbyte
char jchar
short jshort
int jint
long jlong
float jfloat
double jdouble
Object jobject
Class jclass
String jstring
Object[] jobjectArray
boolean[] jbooleanArray
byte[] jbyteArray
char[] jcharArray
short[] jshortArray
int[] jintArray
long[] jlongArray
float[] jfloatArray
double[] jdoubleArray
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,
"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);
}
详尽的示例代码
最后,放一块比较详细的JNI使用代码,基本上覆盖了的全部使用情况。


JniMethodInfo minfo;//JniHelper


/* 测试用方法 */
/*bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","loginGree", "()V"); //
if (isHave) {
//CCLog("有showText ");
minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID);
}else
{
//CCLog("没有方法showText");
}*/


/* 分享 */
/*//将c++中的string转换成java中的string
//char str[] = "test";
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","shareSina", "(Ljava/lang/String;Ljava/lang/String;)V"); //
if (isHave) {
//CCLog("有share ");
jstring jstr = minfo.env->NewStringUTF("test1 share");
jstring jst = minfo.env->NewStringUTF("/data/data/com.cocoa/cy.png");
//jstring jst = minfo.env->NewStringUTF("");
minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID,jstr,jst);
}else
{
//CCLog("没有方法share");
}*/
/* 设置高分 */
/*jint ind = 0;
jlong lsre = 2202l;
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","setHighScore", "(IJ)V");
if (isHave) {
minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID,ind,lsre);
}*/
/* 成就解锁 */
/*jint aind = 0;
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","unLock", "(I)V");
if (isHave) {
minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID,aind);
}*/
/* 测试用方法 */
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","rtnActivity","()Ljava/lang/Object;");
jobject jobj;