通过 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 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?