如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)

如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx),第1张

概述所以我正在用Cocos2Dx开发一个小项目,但我正在尝试添加蓝牙功能,这意味着调用静态方法可以访问Main Activity与 Android API的关联.我见过的几乎所有内容都告诉我遵循这个程序: – 创建主要活动的实例(environment-> NewGlobalRef是我正在使用的实例) – 从活动中获取方法并执行它(environment-> GetObjectClass) 这是代码 所以我正在用Cocos2Dx开发一个小项目,但我正在尝试添加蓝牙功能,这意味着调用非静态方法可以访问Main Activity与 Android API的关联.我见过的几乎所有内容都告诉我遵循这个程序:
– 创建主要活动的实例(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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1127057.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存