Android Cocos2d-X JNI的应用(一)
2015-01-27 16:02
239 查看
我们在用2dx开发Android项目的时候会有很多 C++与Java需要交互数据的地方
首先来看一下2dx的 platform/android/jni/ 下的JniHelper类 :
这是最常调用的方法之一:
形参理解(方法信息,Java端被调用的类名,Java端被调用方法名,传递的参数类型+返回的参数类型)
()V代表参数类型都为void
()Z代表传递的参数类型为void 返回类型为bool
()I 代表传递的参数类型为void 返回类型为int
(I)Ljava/lang/String;代表传递的参数类型为int 返回类型为String(这里要格外注意: 分号一定不要忘记)
如果用到返回String类型的数据时 就要用到String转char*的方法了
然后就是Android端 的接口方法了
首先来看一下2dx的 platform/android/jni/ 下的JniHelper类 :
这是最常调用的方法之一:
形参理解(方法信息,Java端被调用的类名,Java端被调用方法名,传递的参数类型+返回的参数类型)
static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);
void jniTest() { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, "org/cocos2dx/cpp/AppActivity", "jniTest", "()V")) { t.env->CallStaticVoidMethod(t.classID,t.methodID); t.env->DeleteLocalRef(t.classID); return; } }这里要注意
getStaticMethodInfo方法的常用的第四个参数书写方式:
()V代表参数类型都为void
()Z代表传递的参数类型为void 返回类型为bool
()I 代表传递的参数类型为void 返回类型为int
(I)Ljava/lang/String;代表传递的参数类型为int 返回类型为String(这里要格外注意: 分号一定不要忘记)
如果用到返回String类型的数据时 就要用到String转char*的方法了
/******************************************************************************* * Function Name : jstringTostr * Description : String 转换成 Char* * Input : String * Output : Char* * Return : Char* *******************************************************************************/ static char* jstringTostr(JNIEnv* env, jstring jstr) { char* pStr = NULL; jclass jstrObj = env->FindClass("java/lang/String"); jstring encode = env->NewStringUTF("utf-8"); jmethodID methodId = env->GetMethodID(jstrObj, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray byteArray = (jbyteArray) env->CallObjectMethod(jstr, methodId, encode); jsize strLen = env->GetArrayLength(byteArray); jbyte *jBuf = env->GetByteArrayElements(byteArray, JNI_FALSE); if (jBuf > 0) { pStr = (char*) malloc(strLen + 1); memset(pStr, 0x00, strLen + 1); if (!pStr) { return NULL; } memcpy(pStr, jBuf, strLen); pStr[strLen] = 0; } env->ReleaseByteArrayElements(byteArray, jBuf, 0); env->DeleteLocalRef(byteArray); env->DeleteLocalRef(encode); return pStr; }
然后就是Android端 的接口方法了
public static void jniTest() { Log.e("AppActivityTag", "jniTest In Java"); }注意
getStaticMethodInfo这里用的是调用Static方法,Android端就要相应的用 Static方法;
相关文章推荐
- cocos2d-x开发之如何在Android应用中加入广告(转载)
- Cocos2d-x开发的Android应用怎么添加插屏广告
- 4. iPhone5的适配方案(游戏+应用) cocos2d-x android
- cocos2d-x_Android应用启动调用过程简析
- cocos2d-x 游戏嵌入到ios/android应用内部 - android篇
- Cocos2d-x 3.X里的坑(2)——安卓android APP应用名称的修改
- 枫叶天空Cocos2d-x3.0系列教程之发布教程一 在Win7下使用Eclipse及Cygwin发布Android应用
- Android版Cocos2d-X应用的AnySDK集成Admob管理库教程
- Cocos2d-x开发的Android应用怎么加入插屏广告
- Android平台下Cocos2d-x等含有so库应用性能分析-Gprof(android-ndk-profiler)
- 是否可以用cocos2d-x开发跨ios\android等平台应用
- Cocos2d-x项目编译为Android应用——命令行方式
- android 重启应用(cocos2d-x重启游戏)
- cocos2d-x_Android应用启动调用过程简析
- 怎样开发适应不同分辨率的Android应用
- 分享第一本中文Android书籍(应用框架和程序设计--高焕堂)
- Android是一个应用框架,而不是类别库
- 【视频】Android应用软件前景分析
- android基础应用
- Google手机操作系统Android应用开发入门