通过JNI,我们可以很方便的使用Android已经实现的很多功能,比如获取IMEI,这里我们的例子也是用获取IMEI来讲解的。
Android:
首先我们需要一个静态的方法:
package com.test.tool;
public class Tool {
public static Context mContext; //在MainActivity里初始化
public static String getImei(){
return ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
}
}
如有需要,可以传入一个或多个参数,也可以返回或不返回。
cocos2dx:
包含头文件:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "jni.h"
#include "platform/android/jni/JniHelper.h"
#endif
调用的方法:
char* Test::getIMEI(){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo minfo;
jobject jobj;
bool b = JniHelper::getStaticMethodInfo(minfo,
"com/test/tool/Tool", //类路径 <span style="color:#FF0000;">请修改成自己的类路径</span>
"getImei", //静态方法名
"()Ljava/lang/String;"); //括号里的是参数,后面的是返回值。
if(b)
{
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
char *imei= jstringTostring(minfo.env,(jstring)jobj);
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getImei():%s",imei);//打印出获取到的imei
return IMEI;
}
#endif
return NULL;
}
传入参数、返回参数的字段描述符:
String | |
I | int |
V | void |
Z | boolean |
B | byte |
C | char |
D | double |
S | short |
J | long |
F | float |
数组 | 以“[”开头,后面跟着类型,如”[i“表示int[];"[[int"表示int[][]; |
Objects对象 | 以"L"开头,以";"结尾,中间是用"/" 隔开的包名及类名。比如:Ljava/lang/Object; 如果是嵌套类,则用$来表示嵌套。 |
本文如有不对的地方,欢迎指出。