Я давно забыл 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. Я исправил код выше. Извините за это.