gpt4 book ai didi

c++ - 包括来自不同目录的头文件的问题[不是路径问题]

转载 作者:太空狗 更新时间:2023-10-29 20:00:07 26 4
gpt4 key购买 nike

我早就忘记了c++以及如何正确使用它,但现在我不得不处理一个类,我有点卡住了。所以我正在使用 cocos2dx 为 ios 编写游戏,但是我使用的是 Lua 绑定(bind)而不是 c++。但是......尽管如此,我需要编写一些使用 JNI 的东西,所以......我们来了 c/c++。

我有这样的头文件和cpp文件:

DeviceInfoAndroid.h:

#include <jni.h>
#include "../libs/cocos2dx/platform/android/jni/JniHelper.h"

extern "C" {

const char* getAndroidDeviceId();

}

DeviceInfoAndroid.cpp:

#ifndef _DEVICE_INFO_ANDROID_
#define _DEVICE_INFO_ANDROID_

#include "DeviceInfoAndroid.h"
#include <string>

extern "C" {

const char *getAndroidDeviceId() {
JniMethodInfo t;
const char* retVal;
if (JniHelper::getStaticMethodInfo(t
, "org/cocos2dx/lib/Cocos2dxActivity" //org/cocos2dx/lib/Cocos2dxActivity
, "getIMEI"
, "()Ljava/lang/String;")) {
jstring jstr;
jstr = (jstring);
t.env->CallStaticObjectMethod(t.classID, t.methodID);
char *cstr;
cstr = (char *) t.env->GetStringUTFChars(jstr, 0);
std::string ret(cstr);
t.env->ReleaseStringUTFChars(jstr, cstr);
t.env->DeleteLocalRef(jstr);
retVal = ret.c_str();
}
return retVal;
}
}

#endif

我知道所有这些 #ifndef 废话都不需要,因为我只在一个地方使用它,并且只在一个地方使用它,所以不会发生循环依赖性,但我还是添加了它 [当我删除时它不会改变它]。

所以.. JniHelper.h 文件的路径是正确的。顺便说一句,它看起来像这样:

JniHelper.h

#ifndef __ANDROID_JNI_HELPER_H__
#define __ANDROID_JNI_HELPER_H__

#include <jni.h>
#include <string>
#include "CCPlatformMacros.h"

namespace cocos2d {

typedef struct JniMethodInfo_
{
JNIEnv * env;
jclass classID;
jmethodID methodID;
} JniMethodInfo;

class CC_DLL JniHelper
{
public:
static JavaVM* getJavaVM();
static void setJavaVM(JavaVM *javaVM);
static jclass getClassID(const char *className, JNIEnv *env=0);
static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);
static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);
static std::string jstring2string(jstring str);

private:
static JavaVM *m_psJavaVM;
};
}

#endif // __ANDROID_JNI_HELPER_H__

好的.. 现在.. 我使用 makefile 来构建它 [它是更大构建过程的一部分,但对于这个特定的文件,它看起来像这样(它与 .h 和 .cpp 位于同一目录中我粘贴在这里的文件]。

安卓.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_logic

LOCAL_SRC_FILES := \
AppDelegate.cpp \
DeviceInfoAndroid.cpp \
DeviceInfo.cpp \
../libs/lua/cocos2dx_support/LuaEngineImpl.cpp \
../libs/lua/cocos2dx_support/Cocos2dxLuaLoader.cpp \
../libs/lua/cocos2dx_support/LuaCocos2d.cpp \
../libs/lua/cocos2dx_support/LuaEngine.cpp \
../libs/lua/CocosDenshion_support/LuaSimpleAudioEngine.cpp \
../libs/lua/exts/luallthread/llthreads.c \
../libs/lua/exts/luasocket/auxiliar.c \
../libs/lua/exts/luasocket/buffer.c \
../libs/lua/exts/luasocket/except.c \
../libs/lua/exts/luasocket/inet.c \
../libs/lua/exts/luasocket/io.c \
../libs/lua/exts/luasocket/luasocket.c \
../libs/lua/exts/luasocket/mime.c \
../libs/lua/exts/luasocket/options.c \
../libs/lua/exts/luasocket/select.c \
../libs/lua/exts/luasocket/tcp.c \
../libs/lua/exts/luasocket/timeout.c \
../libs/lua/exts/luasocket/udp.c \
../libs/lua/exts/luasocket/unix.c \
../libs/lua/exts/luasocket/usocket.c \
../libs/lua/exts/lualoadexts.c \
../libs/lua/exts/luasocketscripts.c

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libs/cocos2dx \
$(LOCAL_PATH)/../libs/cocos2dx/platform \
$(LOCAL_PATH)/../libs/cocos2dx/include \
$(LOCAL_PATH)/../libs/cocos2dx/lua_support \
$(LOCAL_PATH)/../libs/CocosDenshion/include \
$(LOCAL_PATH)/../libs/lua/lua \
$(LOCAL_PATH)/../libs/lua/tolua \
$(LOCAL_PATH)/../libs/lua/cocos2dx_support \
$(LOCAL_PATH)/../libs/lua/CocosDenshion_support \
$(LOCAL_PATH)/../libs/lua/exts \
$(LOCAL_PATH)/../libs/lua/exts/luallthread \
$(LOCAL_PATH)/../libs/lua/exts/luasocket \
$(LOCAL_PATH)/../libs/cocos2x/platform/android/jni \

LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../Android/libs/$(TARGET_ARCH_ABI)) \
-L$(call host-path, $(LOCAL_PATH)/../libs/cocos2dx/platform/third_party/android/libraries/$(TARGET_ARCH_ABI)) -lcurl \
-lcocos2d \
-lcocosdenshion \
-llua

include $(BUILD_SHARED_LIBRARY)

如您所见,我已将 JniHelper.h 文件的路径添加到 LOCAL_C_INCLUDES。我试过删除路径并只使用“JniHelper.h”,但它会抛出一个错误,指出该文件不存在。

我在构建过程中得到的错误是:

Compile++ thumb  : game_logic <= DeviceInfoAndroid.cpp
jni/../../Classes/DeviceInfoAndroid.cpp: In function 'const char* getAndroidDeviceId()':
jni/../../Classes/DeviceInfoAndroid.cpp:10: error: 'JniMethodInfo' was not declared in this scope
jni/../../Classes/DeviceInfoAndroid.cpp:10: error: expected ';' before 't'
jni/../../Classes/DeviceInfoAndroid.cpp:12: error: 'JniHelper' has not been declared
jni/../../Classes/DeviceInfoAndroid.cpp:12: error: 't' was not declared in this scope
jni/../../Classes/DeviceInfoAndroid.cpp:17: error: expected primary-expression before ')' token
make: *** [obj/local/armeabi/objs-debug/game_logic/DeviceInfoAndroid.o] Error 1

有什么建议吗?我做错了什么?我知道为了用 C++ 编写我有很多东西要学,但正如我提到的......我不会用 C++ 编写,它只是我需要为我拥有的每种设备类型创建的几行代码支持我的游戏。我已经完成了混合使用 Objective-C 和 C++ 来获取 iOS 设备 ID。

编辑:当删除我的一些评论时,我设法删除了 DeviceInfoAndroid.cpp 的包含。我已经更正了上面的代码。对此感到抱歉。

最佳答案

在您修改后,这是我更新后的答案:

JniMethodInfo 存在于命名空间 cocos2d 中,因此您应该将其引用为:

cocos2d::JniMethodInfo t;

JniHelper 也是如此:

if (cocos2d::JniHelper::getStaticMethodInfo等等

编辑前的回答:(不再相关,但保存在这里以供引用)

您需要将头文件中的包含移动到 cpp 文件中。 DeviceInfoAndroid.h 不会自动包含在 DeviceInfoAndroid.cpp 中。您必须手动包含它。

关于c++ - 包括来自不同目录的头文件的问题[不是路径问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674631/

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