gpt4 book ai didi

android - 如何从 Android 正确调用 Java 中的非静态函数? (组合中的 Cocos2Dx)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:55 25 4
gpt4 key购买 nike

因此,我正在使用 Cocos2Dx 开发一个小项目,但我正在尝试添加蓝牙功能,这意味着调用非静态方法以便能够访问 Main Activity 与 Android API 的关联。几乎所有我见过的东西都告诉我要遵循这个程序:- 创建主要 Activity 的实例(环境-> NewGlobalRef 是我正在使用的那个)- 从 Activity 中获取方法并执行它(环境->GetObjectClass)

这是代码。在 Java 中,我们有以下内容(省略 onCreate、onResume 等逻辑内容):

public class TSP extends Cocos2dxActivity{
public void CnxAttempt(){
Log.e("TSP_BT","aTTEMPTING!");
}
}

就是这样!就目前而言,我只想显示一条日志消息,确认函数已执行。现在,有趣的部分是 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 时,它会崩溃,因为它无法识别 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.

如果你想调用一个对象的非静态方法,你需要将对象传递给本地方法(如果它存在 - 主 Activity 不应该已经存在吗?),使用 NewObject 创建一个新的* 函数,或通过调用一些工厂方法。

然后获取对象的class对象,获取methodID然后调用方法。

关于android - 如何从 Android 正确调用 Java 中的非静态函数? (组合中的 Cocos2Dx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com