第一步: #include "com_hs_androidjnidemo_MainActivity.h" #include "jni.h" #include <stdio.h> #include <YLWwiseEngine.h> #include <AK/SoundEngine/Common/AkTypes.h> //全局变量 gaden JavaVM *g_vm; //0.JNI_OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { g_vm = vm; return JNI_VERSION_1_6; } //1.initWwise JNIEXPORT void JNICALL Java_com_hs_androidjnidemo_MainActivity_initWwise (JNIEnv *env, jobject thiz, jobject activity,jstring path) { const char* cStr = env->GetStringUTFChars(path, nullptr); YLWwiseEngine::getInstance()->init(cStr,env,thiz,activity,g_vm); // return env->NewStringUTF("string1 from c"); } //2.SetBasePath JNIEXPORT void JNICALL Java_com_hs_androidjnidemo_MainActivity_SetBasePath (JNIEnv *env, jobject thiz,jstring path) { const char* cStr = env->GetStringUTFChars(path, nullptr); YLWwiseEngine::getInstance()->SetBasePath(cStr); }
第二步:
bool YLWwiseEngine::init(const char* basePath,JNIEnv *env,jobject obj,jobject activity,JavaVM *g_vm) { this->env1 =env; this->g_VM2=g_vm; AkPlatformInitSettings platformInitSettings; env->GetJavaVM(&g_VM1); jobject mainActivityObj = env->NewGlobalRef(activity); platformInitSettings.pJavaVM = g_VM1; platformInitSettings.jActivity =mainActivityObj; this->activity1 =mainActivityObj; //注意activity1 AKRESULT res0 = m_pLowLevelIO->Init(platformInitSettings.pJavaVM,platformInitSettings.jActivity); if (res0 != AK_Success) { __android_log_print(ANDROID_LOG_INFO, "lclclc", "---Error----\n"); return false; }
第三步:SetBasePath
void YLWwiseEngine::SetBasePath(const char* basePath) { char* basePaeht1 = new char[1024]; strcpy(basePaeht1,basePath); AKRESULT ret = m_pLowLevelIO->SetBasePath(basePaeht1); if (ret != AK_Success) { __android_log_print(ANDROID_LOG_INFO, "lclclc", "-------SetBasePath22-------- ret %d\n", ret); //log i类型 } }
第四步:postEventFun回调
int YLWwiseEngine::postEventFun(const char* eventName, unsigned int gameObjectId, unsigned int funId,JNIEnv *env,JavaVM *g_vm) { this->env1 =env; char* pcname = new char[1024];//锟姐够锟斤拷 strcpy(pcname, eventName); PostObj* postobj = new PostObj(); postobj->funId = funId; postobj->eventName = pcname; postobj->env = env; postobj->g_vm = g_vm; AkPlayingID id = AK::SoundEngine::PostEvent(eventName, gameObjectId, AK_EndOfEvent | AK_Marker | AK_EnableGetSourcePlayPosition, PostEventGan::getInstance()->postCallback, postobj); // this->update(); AK::SoundEngine::RenderAudio(); if (id == AK_INVALID_PLAYING_ID) { printf("postEventʧ�ܣ���������%d\n", id); return 0; } return id; }
回调
void PostEventGan::postCallback(AkCallbackType in_eType, AkCallbackInfo* in_pCallbackInfo) { PostObj* curPost1 = (PostObj*)in_pCallbackInfo->pCookie; if (in_eType == AK_EndOfEvent) { // char* geline = "|"; int funId = curPost1->funId; char funId_str[10]; sprintf(funId_str,"%d",funId); __android_log_print(ANDROID_LOG_INFO, "lclclc", "------PostEventGan::postCallback2---111----funId_str %s\n", funId_str); //log i类型 //ccjsbridge::excuteJS("CCToJsUtils", "CccToJSAK_EndOfEvent", funId_str); JavaVM *g_vm=curPost1->g_vm; JNIEnv *env1 = nullptr; jint result = g_vm->AttachCurrentThread(&env1, 0); jclass mainActivityClass = env1->GetObjectClass(YLWwiseEngine::getInstance()->activity1); const char *sig = "(Ljava/lang/String;)V";//"(F)V" jmethodID mainMethodId = env1->GetMethodID(mainActivityClass, "postEventFunOver", sig); env1->CallVoidMethod(YLWwiseEngine::getInstance()->activity1, mainMethodId,env1->NewStringUTF(funId_str)); g_vm->DetachCurrentThread(); }
第五步:子线程回到 java 里面UI线程
public void postEventFunOver(String para) { if (Looper.getMainLooper() == Looper.myLooper()) { System.out.print("-------NativeHelper--c++返回值------Looper.getMainLooper():"+Looper.getMainLooper()+"\n"); } else { System.out.print("-------NativeHelper--c++返回值------a:"+para+"\n"); activity.runOnUiThread(()-> { // activity.getJsInterface().youLoftLoginFail(); activity.getWebView().loadUrl("javascript:wwise_CccToJSAK_EndOfEvent("+para+")"); }); } };