Проблемы, включая заголовочный файл из другого каталога [не проблема пути] - PullRequest
3 голосов
/ 30 декабря 2011

Я давно забыл c ++ и как правильно его использовать, но теперь мне приходится иметь дело с одним классом, и я немного застрял. Поэтому я использую cocos2dx для написания игры для ios, однако вместо c ++ я использую привязки Lua. Но ... хотя мне нужно написать что-то, что использует 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 правильный. Похоже, что это между прочим ::1013*

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__

Хорошо ... сейчас .. Я использую make-файл для его сборки [это часть более крупного процесса сборки, но для этого конкретного файла это выглядит так (он находится в том же каталоге, что и .h и .cpp файлы, которые я вставил сюда].

Android.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.

EDIT: при удалении некоторых моих комментариев мне удалось удалить включение DeviceInfoAndroid.cpp. Я исправил код выше. Извините за это.

1 Ответ

9 голосов
/ 30 декабря 2011

После вашего редактирования вот мой обновленный ответ:

JniMethodInfo существует в пространстве имен cocos2d, поэтому вы должны ссылаться на него как:

cocos2d::JniMethodInfo t;

То же самое касается JniHelper:

if (cocos2d::JniHelper::getStaticMethodInfo и т. Д.

Ответ перед вашими правками: (больше не актуален, но сохранен здесь для справки)

Вам необходимо переместить включения из файла заголовка в файл cpp.DeviceInfoAndroid.h не включается автоматически в DeviceInfoAndroid.cpp.Вы должны включить его вручную.

...