通过 JNI (Cocos2dx) 获取 Java 对象到 C++

Posted

技术标签:

【中文标题】通过 JNI (Cocos2dx) 获取 Java 对象到 C++【英文标题】:Getting Java object to C++ via JNI (Cocos2dx) 【发布时间】:2014-06-28 22:56:06 【问题描述】:

我遇到了一个问题,我需要访问自定义 java 类才能将其绑定到自定义 C++ 类(我正在为 android 移植一个框架)。

我做过这样的事情:

        bool Myclass_Android::getBoolean() 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
            cocos2d::JniMethodInfo methodInfo;
            if(cocos2d::JniHelper::getStaticMethodInfo(methodInfo, classInfo, "methodname", "()Z") == true)
                CCLOG("method exists");
                methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID);
            else
                CCLOG("method doesn't exist");
            
#endif
        

Pastebin:http://pastebin.com/y50nJzvR

从 Android 框架中检索布尔值。我可以像上面一样做一个完整的自定义 Java 类并访问它的成员吗?

只是为了清楚。我想使用的方法应该返回我创建的自定义 C++ 类。我只需要在方法范围内访问 Java 对象并将其成员绑定到 C++ 类。

我见过一些 JNIEXPORT void JNICALL 的东西,但我似乎无法理解它们或让这些东西正常工作的导入。

如果上面使用的方法也适用于自定义类,那就太好了,这将是一个救命稻草。

提前致谢!

【问题讨论】:

【参考方案1】:

我通过使用这些方法设法解决了这个问题:

jclass myClass = methodInfo.env->FindClass("com/your/package/class");

这是对您想要工作的实际 Java 自定义对象的引用

jfieldID someId = methodInfo.env->GetFieldID("com/your/package/class", "someId", "J");

这将获取您要使用的字段。在这种情况下,一个 Long (J)。然后要实际使用它,您需要获取对象(在本例中是上面指定的类中的对象):

jobject obj = (jobject) methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);

最后要将对象字段值从 Java 获取到 C++,您可以使用:

long _someId = (long) methodInfo.env->GetLongField(obj, someId);

P.S,我是作者。由于我目前驻扎在其他地方,所以没有时间切换帐户。

【讨论】:

现在我很好奇你为什么删除了你的另一个问题,因为我为此付出了一些努力。你解决问题了吗?那为什么不回答呢?如果问题是无关的,为什么不添加评论呢?

以上是关于通过 JNI (Cocos2dx) 获取 Java 对象到 C++的主要内容,如果未能解决你的问题,请参考以下文章

(JNI) 使用 GetMethodID 获取 Java 方法的内存地址

怎么把cocos2dx游戏代码proj.android导入到androidstudio里

Java中JNI的使用(下)

java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?

JNI内通过参数形式从C/C++中传递string类型数据至Java层

如何把c++中的unsigned char* mData的数据指针通过jni把数据传给java使用?