static jobject cuttherope_CallObjectMethodV(JNIEnv *env, jobject p1, jmethodID p2, va_list p3) { MODULE_DEBUG_PRINTF("cuttherope_CallObjectMethodV %s (%s)\n",p2->name,p2->sig); struct dummy_array *array; if (strcmp(p2->name, "loadData") == 0) { struct dummy_jstring *arg; arg = va_arg(p3, struct dummy_jstring*); jboolean flag = va_arg(p3, jint); (void)flag; char *filename = malloc(strlen(arg->data) + strlen("assets/") + 1); sprintf(filename, "assets/%s", arg->data); MODULE_DEBUG_PRINTF(" data=%s\n",arg->data); if ((array = GLOBAL_J(env)->read_file_to_jni_array(filename))) { MODULE_DEBUG_PRINTF(" data=%s size=%d\n", arg->data, array->length); // Poll for events here to avoid "not responding" messages SDL_Event e; while (SDL_PollEvent(&e)); return array; } else { MODULE_DEBUG_PRINTF(" data=%s not found\n",arg->data); return GLOBAL_J(env); } } else if (strcmp(p2->name, "getBytesOfBitmap") == 0) {
jobject fruitninja_jnienv_CallStaticObjectMethodV(JNIEnv*env, jclass p1, jmethodID p2, va_list p3) { struct dummy_jclass *jcl = p1; if( strcmp( p2->name, "SFXPlayInternal" ) == 0 ) { char *soundname = NULL; soundname = dup_jstring(global, va_arg(p3, jstring*)); int i; for(i = 0; soundname[i]; i++) { soundname[i] = tolower(soundname[i]); // LowerCase soundname } for(i=0; i <= MAX_SOUNDS; i++) { if ( SFX[i].sound == NULL ) break; if ( memcmp(SFX[i].name, soundname, strlen(soundname)) == 0 ) { /* Play some sweet sounds? */ MODULE_DEBUG_PRINTF("module: Play sound: %s\n", SFX[i].name); apkenv_mixer_play_sound(SFX[i].sound, 0); free(soundname); return NULL; } } MODULE_DEBUG_PRINTF("module: Sound not found: %s\n", soundname); free(soundname); }
/* NewObjectV override. Initialize audio output */ jobject JNIEnv_NewObjectV(JNIEnv *env, jclass p1, jmethodID p2, va_list p3) { struct dummy_jclass *clazz = p1; MODULE_DEBUG_PRINTF("module_JNIEnv_NewObjectV(%x, %s, %s)\n", p1, p2->name, clazz->name); if (strcmp(clazz->name, "com/rovio/ka3d/AudioOutput") == 0) { /* Open the audio device */ desired = malloc(sizeof(SDL_AudioSpec)); obtained = malloc(sizeof(SDL_AudioSpec)); audioHandle = va_arg(p3, jlong); desired->freq = va_arg(p3, int); desired->channels = va_arg(p3, int); desired->format = AUDIO_S16SYS; jint bitrate = va_arg(p3, int); desired->samples = va_arg(p3, int) / 8; desired->callback=my_audio_callback; desired->userdata=NULL; MODULE_DEBUG_PRINTF("Module: Handle: %lld, freq: %i, channels: %i, bitrate: %i, samples: %i\n", audioHandle,desired->freq,desired->channels,bitrate,desired->samples); assert( SDL_OpenAudio(desired, obtained) == 0 ); free(desired); }
static void unity_init(struct SupportModule *self, int width, int height, const char *home) { global = GLOBAL_M; system("export MALLOC_CHECK_=0"); //<unit? or who? does something weird on the pandora ... MODULE_DEBUG_PRINTF("JNI_OnLoad\n"); self->priv->JNI_OnLoad_libunity(VM_M,0); MODULE_DEBUG_PRINTF("JNI_OnLoad done.\n"); MODULE_DEBUG_PRINTF("nativeInit\n"); self->priv->nativeInit(ENV_M,GLOBAL_M,width,height); MODULE_DEBUG_PRINTF("nativeInit done\n"); MODULE_DEBUG_PRINTF("unityAndroidInit\n"); jstring bin = GLOBAL_M->env->NewStringUTF(ENV_M,"assets/bin/"); jstring lib = GLOBAL_M->env->NewStringUTF(ENV_M,"./lib/");//strcat(home,"lib/")); self->priv->unityAndroidInit(ENV_M,GLOBAL_M,bin,lib); MODULE_DEBUG_PRINTF("unityAndroidInitDone\n"); MODULE_DEBUG_PRINTF("nativeFile\n"); jstring file = GLOBAL_M->env->NewStringUTF(ENV_M,global->apk_filename); self->priv->nativeFile(ENV_M,GLOBAL_M,file); MODULE_DEBUG_PRINTF("nativeFile done\n"); }
const char * JNIEnv_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy) { MODULE_DEBUG_PRINTF("JNIEnv_GetStringUTFChars(%x)\n", string); if (string == GLOBAL_J(env)) { MODULE_DEBUG_PRINTF("WARNING: GetStringUTFChars on global\n"); return NULL; } if (string == NULL) { return strdup(""); } struct dummy_jstring *str = (struct dummy_jstring*)string; MODULE_DEBUG_PRINTF(" \\-> %s\n", str->data); return str->data; }
/* CallVoidMethodV override. Signal when to start or stop audio */ void JNIEnv_CallVoidMethodV(JNIEnv* p0, jobject p1, jmethodID p2, va_list p3) { MODULE_DEBUG_PRINTF("module_JNIEnv_CallVoidMethodV(%x, %s, %s)\n", p1, p2->name, p2->sig); if (strcmp(p2->name, "startOutput") == 0) { MODULE_DEBUG_PRINTF("Start audio Output\n"); SDL_PauseAudio(0); } if (strcmp(p2->name, "stopOutput") == 0) { // Stop output :) MODULE_DEBUG_PRINTF("Stop audio Output\n"); SDL_PauseAudio(1); } }
/* CallVoidMethodV override. Signal when to start or stop audio */ void angrybirds_jnienv_CallVoidMethodV(JNIEnv* p0, jobject p1, jmethodID p2, va_list p3) { MODULE_DEBUG_PRINTF("module_angrybirds_jnienv_CallVoidMethodV(%x, %s, %s)\n", p1, p2->name, p2->sig); if (strcmp(p2->name, "startOutput") == 0) { MODULE_DEBUG_PRINTF("Start audio Output\n"); apkenv_audio_play(); } if (strcmp(p2->name, "stopOutput") == 0) { // Stop output :) MODULE_DEBUG_PRINTF("Stop audio Output\n"); apkenv_audio_pause(); } }
jobject JNIEnv_NewGlobalRef(JNIEnv* p0, jobject p1) { MODULE_DEBUG_PRINTF("JNIEnv_NewGlobalRef(%x)\n", p1); if (p1==NULL) { struct dummy_jclass* cls = malloc(sizeof(struct dummy_jclass)); cls->name = "null"; dummy_jobject* obj = malloc(sizeof(dummy_jobject)); obj->clazz = cls; obj->field = NULL; MODULE_DEBUG_PRINTF("JNIEnv_NewGlobalRef(%x) -> %x\n", p1, obj); return obj; } //dummy_jobject return NULL; }
/* Load all SFX into memory */ void load_sound_callback(const char *filename, char *buffer, size_t size) { char* fname = strrchr (filename, '/') + 1; MODULE_DEBUG_PRINTF("module: Load sound: %s\n", fname); SFX[SoundCount].name = strdup(fname); SFX[SoundCount].sound = apkenv_mixer_load_sound_buffer(buffer, size); SoundCount++; }
jclass JNIEnv_GetObjectClass(JNIEnv *p0, jobject p1) { MODULE_DEBUG_PRINTF("GetObjectClass %x\n",p1); if (p1!=NULL) { dummy_jobject* obj = p1; return obj->clazz; } return NULL; }
jobject JNIEnv_CallObjectMethod(JNIEnv* env, jobject p1, jmethodID p2, ...) { MODULE_DEBUG_PRINTF("CallObjectMethod %x %x\n",p1,p2); //dummy_jobject* obj = p1; jmethodID method = p2; if (strcmp(method->name,"getPackageCodePath")==0) return (*env)->NewStringUTF(env, GLOBAL_J(env)->apk_filename); return NULL; }
jobject worldofgoo_CallObjectMethodV(JNIEnv *env, jobject p1, jmethodID p2, va_list p3) { MODULE_DEBUG_PRINTF("worldofgoo_CallObjectMethodV %x %s\n", p1, p2->name); if (strcmp(p2->name, "getApkPath") == 0) { return (*env)->NewStringUTF(env, GLOBAL_J(env)->apk_filename); } else if (strcmp(p2->name, "getExternalStoragePath") == 0) { return (*env)->NewStringUTF(env, worldofgoo_priv.home_directory); } else if (strcmp(p2->name, "getInternalStoragePath") == 0) { return (*env)->NewStringUTF(env, worldofgoo_priv.home_directory); } else if (strcmp(p2->name, "getLanguage") == 0) { return (*env)->NewStringUTF(env, ""); } else if (strcmp(p2->name, "playSound") == 0) { struct dummy_jstring *name = va_arg(p3, struct dummy_jstring *); int loop = va_arg(p3, int); double volume = va_arg(p3, double); void *ret; MODULE_DEBUG_PRINTF("playSound '%s', %d, %f\n", name->data, loop, volume); ret = play_sound(name->data, loop, volume); MODULE_DEBUG_PRINTF(" = %p\n", ret); return ret; } else {
jobject JNIEnv_GetStaticObjectField(JNIEnv *p0, jclass p1, jfieldID p2) { struct dummy_jclass* cls = p1; struct _jfieldID* fld = (void *)p2; MODULE_DEBUG_PRINTF("GetStaticObjectField %s, %s, %s\n", cls->name, fld->name, fld->sig); dummy_jobject* obj = malloc(sizeof(dummy_jobject)); obj->clazz = cls; obj->field = p2; return obj; }
jfieldID JNIEnv_GetStaticFieldID(JNIEnv *p0, jclass p1, const char *p2, const char *p3) { struct dummy_jclass* cls = (struct dummy_jclass*)p1; MODULE_DEBUG_PRINTF("GetStaticFieldID %s %s %s\n", cls->name, p2, p3); struct _jfieldID* field = malloc(sizeof(struct _jfieldID)); field->clazz = p1; field->name = strdup(p2); field->sig = strdup(p3); return (jfieldID)field; }
jint JNIEnv_RegisterNatives(JNIEnv* p0, jclass p1, const JNINativeMethod* p2, jint p3) { MODULE_DEBUG_PRINTF("JNIEnv_RegisterNatives()\n"); struct dummy_jclass *clazz = (struct dummy_jclass*)p1; MODULE_DEBUG_PRINTF("\n\tClass: %s\n", clazz->name); int is_unity_player = strcmp(clazz->name,UNITYPLAYER_CLASS_NAME)==0; int is_player_prefs = strcmp(clazz->name,PLAYERPREFS_CLASS_NAME)==0; int i=0; const JNINativeMethod *method = p2; while (i<p3) { MODULE_DEBUG_PRINTF("\tName: %-20s Sig: %-10s Addr: %x\n", method->name, method->signature, method->fnPtr); if (is_unity_player) { if (method_is(nativeInit)) { unity_priv.nativeInit = (unity_nativeInit_t)method->fnPtr;} else if (method_is(nativeFile)) { unity_priv.nativeFile = (unity_nativeFile_t)method->fnPtr;} else if (method_is(nativeRender)) { unity_priv.nativeRender = (unity_nativeRender_t)method->fnPtr;} else if (method_is(initJni)) { unity_priv.initJni = (unity_initJni_t)method->fnPtr;} else if (method_is(unityAndroidInit)) { unity_priv.unityAndroidInit = (unity_androidinit_t)method->fnPtr;} else if (method_is(unityAndroidPrepareGameLoop)) {unity_priv.unityAndroidPrepareGameLoop = (unity_androidpreparegameloop_t)method->fnPtr;} else ; } else if (is_player_prefs) { if (method_is(InitPlayerPrefs)) { unity_priv.InitPlayerPrefs = (unity_InitPlayerPrefs_t)method->fnPtr;} else ; } method++; i++; } MODULE_DEBUG_PRINTF("\n"); return 0; }
/* NewObjectV override. Initialize audio output */ jobject angrybirds_jnienv_NewObjectV(JNIEnv *env, jclass p1, jmethodID p2, va_list p3) { struct dummy_jclass *clazz = p1; MODULE_DEBUG_PRINTF("module_angrybirds_jnienv_NewObjectV(%x, %s, %s)\n", p1, p2->name, clazz->name); if (strcmp(clazz->name, "com/rovio/ka3d/AudioOutput") == 0) { /* Open the audio device */ audioHandle = va_arg(p3, jlong); int freq = va_arg(p3, int); enum AudioFormat format = AudioFormat_S16SYS; int channels = va_arg(p3, int); jint bitrate = va_arg(p3, int); int samples = va_arg(p3, int) / 8; apkenv_audio_open(freq, format, channels, samples, my_audio_callback, NULL); }
jobject JNIEnv_CallStaticObjectMethod(JNIEnv* env, jclass p1, jmethodID p2, ...) { struct dummy_jclass* clazz = p1; jmethodID method = p2; MODULE_DEBUG_PRINTF("JNIEnv_CallStaticObjectMethod(%s,%s)\n",clazz->name,method->name); if (strcmp(method->name,"getProperty")==0) { //jstring property = va_arg(p3,jstring); //const char* prop = (*env)-> //dummy_jobject* obj = malloc(sizeof(dummy_jobject)); //return obj; return (*env)->NewStringUTF(env, GLOBAL_J(env)->apk_filename); } else if (strcmp(method->name,"getPackageCodePath")==0) { return (*env)->NewStringUTF(env, GLOBAL_J(env)->apk_filename); } return NULL; }
static void unity_init(struct SupportModule *self, int width, int height, const char *home) { global = GLOBAL_M; system("export MALLOC_CHECK_=0"); //<unit? or who? does something weird on the pandora ... MODULE_DEBUG_PRINTF("JNI_OnLoad\n"); self->priv->JNI_OnLoad_libunity(VM_M,0); MODULE_DEBUG_PRINTF("JNI_OnLoad done.\n"); self->priv->nativeInit = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "nativeInit"); self->priv->nativeFile = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "nativeFile"); self->priv->nativeRender = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "nativeRender"); self->priv->initJni = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "initJni"); self->priv->unityAndroidInit = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "unityAndroidInit"); self->priv->unityAndroidPrepareGameLoop = jnienv_find_native_method(UNITYPLAYER_CLASS_NAME, "unityAndroidPrepareGameLoop"); self->priv->InitPlayerPrefs = jnienv_find_native_method(PLAYERPREFS_CLASS_NAME, "InitPlayerPrefs"); MODULE_DEBUG_PRINTF("nativeInit\n"); self->priv->nativeInit(ENV_M,GLOBAL_M,width,height); MODULE_DEBUG_PRINTF("nativeInit done\n"); MODULE_DEBUG_PRINTF("unityAndroidInit\n"); jstring bin = GLOBAL_M->env->NewStringUTF(ENV_M,"assets/bin/"); jstring lib = GLOBAL_M->env->NewStringUTF(ENV_M,"./lib/");//strcat(home,"lib/")); self->priv->unityAndroidInit(ENV_M,GLOBAL_M,bin,lib); MODULE_DEBUG_PRINTF("unityAndroidInitDone\n"); MODULE_DEBUG_PRINTF("nativeFile\n"); jstring file = GLOBAL_M->env->NewStringUTF(ENV_M,global->apk_filename); self->priv->nativeFile(ENV_M,GLOBAL_M,file); MODULE_DEBUG_PRINTF("nativeFile done\n"); }
static void load_preferences() { int i; char tmp[PATH_MAX]; strcpy(tmp,cuttherope_priv.home); strcat(tmp,PREFERENCES_FILENAME); memset(cuttherope_priv.keyvalues,0,sizeof(cuttherope_priv.keyvalues)); FILE* fp = fopen(tmp,"rb"); if (!fp) return; for (i=0; i<MAX_KEYVALUES;i++) { KeyValue kv; if(fread(&kv,sizeof(KeyValue),1,fp)!=1) break; cuttherope_priv.keyvalues[i] = kv; MODULE_DEBUG_PRINTF("Loaded key=%s value=%d\n",kv.key,kv.value); } fclose(fp); }
static void load_sound(const char *filename) { const struct ZipFileIndex *zip_index = NULL; struct player_sound *sound; unsigned long hash; const char *mem; int loaded = 0; int i; hash = crc32(0, (void *)filename, strlen(filename)); hash %= sizeof(sounds) / sizeof(sounds[0]); for (sound = sounds[hash]; sound != NULL; sound = sound->next) { if (strcmp(filename, sound->filename) == 0) break; } if (sound != NULL) { fprintf(stderr, "load_sound: %s already loaded?\n", filename); return; } for (i = 0; i < apk_index_pos; i++) { if (strstr(apk_index[i].filename, filename) != NULL) { zip_index = &apk_index[i]; break; } } if (zip_index == NULL) { fprintf(stderr, "load_sound: %s not in apk?\n", filename); return; } sound = calloc(1, sizeof(*sound)); if (sound == NULL) return; sound->filename = strdup(filename); mem = (const char *)worldofgoo_priv.apk_in_mem + zip_index->offset; if (strstr(filename, "music/") != NULL) { sound->music = apkenv_mixer_load_music_buffer((void*)mem, zip_index->length); loaded = (sound->music != NULL); } else { sound->chunk = apkenv_mixer_load_sound_buffer((void*)mem, zip_index->length); apkenv_mixer_set_sound_channel(sound->chunk, -1); if (sound->chunk != NULL) { loaded = 1; /* SDL_mixer can't resample 44100 to 32000 Hz :( */ if (strncmp(mem, "OggS", 4) == 0 && *(unsigned short *)(mem + 0x28) == 44100) apkenv_mixer_sound_lame_resample_44100_32000(sound->chunk); } } if (loaded) { MODULE_DEBUG_PRINTF("loaded %s\n", filename); sound->next = sounds[hash]; sounds[hash] = sound; } else { fprintf(stderr, "failed to load %s\n", filename); free(sound); } }