
– 创建主要活动的实例(environment-> NewGlobalRef是我正在使用的实例)
– 从活动中获取方法并执行它(environment-> GetobjectClass)
这是代码.在java中我们有以下内容(省略onCreate,onResume等逻辑内容):
public class TSP extends Cocos2dxActivity{ public voID CnxAttempt(){ Log.e("TSP_BT","aTTEMPTING!"); }} 而已!就目前而言,我只想显示一条Log消息,确认该函数已执行.现在,有趣的部分是在C:
static jnienv* getjnienv(voID){ jnienv *env = 0; // get jni environment if (gJavaVM->GetEnv((voID**)&env,JNI_VERSION_1_4) != JNI_OK){ cclog("Failed to get the environment using GetEnv()"); } if (gJavaVM->AttachCurrentThread(&env,0) < 0){ cclog("Failed to get the environment using AttachCurrentThread()"); } return env;}typedef struct JniMethodInfo_{ jnienv * env; // The environment jclass classID; // classID jmethodID methodID; // methodID } JniMethodInfo; // Struct that stores most of the important information to relate to Java code static bool getmethodInfo(JniMethodInfo &methodinfo,const char *methodname,const char *paramCode){ jmethodID methodID = 0; jnienv *pEnv = 0; jobject methodobject = NulL; bool bRet = false; do { pEnv = getjnienv(); if (! pEnv){ cclog("getmethodInfo -- pEnv false"); break; } jclass localRef = pEnv->FindClass("org/cocos2dx/tsp/TSP"); if (localRef == NulL) { cclog("getmethodInfo -- localRefCls false"); break; // exception thrown } gCallbackObject = pEnv->NewGlobalRef(localRef); if (gCallbackObject == NulL){ cclog("getmethodInfo -- CallbackOBJ false"); break; } jclass classID = pEnv->GetobjectClass(methodobject); if (!classID){ cclog("getmethodInfo -- classID false"); break; } methodID = pEnv->getmethodID(classID,methodname,paramCode); if (!methodID){ cclog("getmethodInfo -- methodID false"); break; } methodinfo.classID = classID; methodinfo.env = pEnv; methodinfo.methodID = methodID; cclog("getmethodInfo -- methodinfo created"); bRet = true; } while(0); return bRet; } voID CnxAttempt(){ JniMethodInfo methodInfo; // Creating a JniMethodInfo object to store all the data if (! getmethodInfo(methodInfo,"CnxAttempt","()V")){ cclog("getmethodInfo is FALSE :("); return; } methodInfo.env->CallVoIDMethod(methodobject,methodInfo.methodID); methodInfo.env->DeleteLocalRef(methodInfo.classID); } 就是这样!在C上调用CnxAttempt时,它会转到BOOM,因为它无法识别java类中的方法而无法访问它…
有人可以帮我一把吗?如果不清楚,请告诉我.先谢谢了!
Local references are valID for the duration of a native method call,and are automatically freed after the native method returns. Global references remain valID until they are explicitly freed.
如果要对对象调用非静态方法,则需要将对象传递给本机方法(如果存在 – 主活动是否应该存在?),使用NewObject *函数创建一个新方法,或者通过调用一些工厂方法.
然后获取对象的类对象,获取methodID然后调用该方法.
总结以上是内存溢出为你收集整理的如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)全部内容,希望文章能够帮你解决如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)