使用 Marmalade 和 EDK Flurry 编写了简单的代码。
应用程序仅启动会话,发送一个日志事件并停止。
在摩托罗拉 Flipout 上,这个应用程序在没有崩溃的情况下运行良好。
但在三星 Galaxy Tab 上它崩溃了。它是来自 logcat 的日志:
11-21 15:00:31.608: W/dalvikvm(13139): JNI 警告: 0x485c7c40 不是有效的 JNI 参考 11-21 15:00:31.608: W/dalvikvm(13139): 在 Lcom/ideaworks3d/marmalade/LoaderThread ;.runNative (Ljava/lang/String;Ljava/lang/String;)V (GetMethodID)
11-21 15:00:31.608: I/dalvikvm(13139): "Thread-9" prio=5 tid=8 RUNNABLE 11-21 15:00:31.612: I/dalvikvm(13139): | group="main" sCount=0 dsCount=0 s=N obj=0x485d9a20 self=0x249730
11-21 15:00:31.616: I/dalvikvm(13139): | sysTid=13146 nice=0 sched=0/0 cgrp=默认句柄=2397632
11-21 15:00:31.619: I/dalvikvm(13139): at com.ideaworks3d.marmalade.LoaderThread.runNative(Native Method)
11-21 15:00:31.619: I/dalvikvm(13139): 在 com.ideaworks3d.marmalade.LoaderThread.run(LoaderThread.java:712)
11-21 15:00:31.627:E/dalvikvm(13139):VM 中止
更新: 代码:-
#include "flurry.h"
#include "IwGx.h"
int main()
{
IwGxInit();
IwGxSetColClear(0,0,0xff,0xff);
char* i = new char[2];
i[0] = 9 + 48;
i[0] = Flurry::InitFlurry() + 48;
i[1] = '\0';
//Flurry::SetUniqueUserID();
while(!s3eDeviceCheckPauseRequest())
{
IwGxClear();
IwGxPrintString(30, 100, "Flurry D");
IwGxPrintString(30, 110, "Init code");
IwGxPrintString(30, 120 , i);
IwGxFlush();
IwGxSwapBuffers();
s3eDeviceYield(0);
}
Flurry::ExitFlurry();
IwGxTerminate();
return 0;
}
#include "flurry.h"
#ifdef FLURRY
char* Flurry:: FLURRY_ID_ANDROID;
char* Flurry:: FLURRY_ID_IPHONE;
char Flurry:: log_error = 9;
void Flurry :: InitIDsForPlatforms()
{
FLURRY_ID_ANDROID = new char[20];
FLURRY_ID_IPHONE = new char[20];
strcpy(FLURRY_ID_ANDROID, "some number");
strcpy(FLURRY_ID_IPHONE, "some number");
};
int Flurry :: InitFlurry()
{
//if(log_error != 9)
//return log_error;
//Check if Flurry is available
if (!s3eFlurryAvailable())
{
Flurry::log_error = 1;
return 1;
}
Flurry::InitIDsForPlatforms();
//Enable AppCircle
//s3eFlurryAppCircleEnable();
return Flurry::log_error;
//Check the OS is runing on device
switch(s3eDeviceGetInt(S3E_DEVICE_OS))
{
case S3E_OS_ID_ANDROID :
s3eFlurryStart(Flurry::FLURRY_ID_ANDROID);
break;
case S3E_OS_ID_IPHONE :
s3eFlurryStart(Flurry::FLURRY_ID_IPHONE);
break;
default :
Flurry::log_error = 2;
return 2;
}
/*
something more write?
*/
Flurry::log_error = 0;
return 0;
};
void Flurry :: SetUserID(const char* ID)
{
if(!Flurry::log_error)
s3eFlurrySetUserID(ID);
}
void Flurry :: ExitFlurry()
{
if(!Flurry::log_error)
s3eFlurrySetSessionReportOnClose(true);
}
void Flurry :: LogEvent(const char* data)
{
if(!Flurry::log_error)
s3eFlurryLogEvent(data, false);
}
void Flurry :: addParamterToLogEvent(const char* name, const char* data)
{
if(!Flurry::log_error)
addToHashMap(name, data);
}
void Flurry :: addParamterToLogEvent(const char* name, int data)
{
if(Flurry::log_error)
return;
std::stringstream str;
str << data;
addToHashMap(name, str.str().c_str());
}
void Flurry :: LogEventWithParameters(const char* name)
{
if(!Flurry::log_error)
s3eFlurryLogEventMap(name);
}
void Flurry :: SetUniqueUserID()
{
if(!Flurry::log_error)
Flurry :: SetUserID(s3eDeviceGetString(S3E_DEVICE_UNIQUE_ID));
}
#endif