1. 程式人生 > >react-native-android-unity(三)android原生和unity互相通訊

react-native-android-unity(三)android原生和unity互相通訊

一、android向unity傳送訊息
 這個比較比較簡單,unity匯出android的程式碼包,顳部提供了介面,在UnityActivity加入如下程式碼:mUnityPlayer.UnitySendMessage("Main Camera", "CalledFromAndroid", label);
第一個引數是物件,第二個引數是呼叫的腳本里面的方法,第三個引數是傳輸的string。實現效果是android輸入字元,點選傳遞訊息,unity的按鍵和label內容變化。

原理是unity匯出的包,自己封裝了許多方法,需要找到object,和上面掛載的指令碼內的函式方法,即可傳資料。

二、unity

android傳送訊息

 這個稍微複雜點,我理解的是最終unity和android都在同一個程式碼包裡,unity呼叫庫,庫內部包含的是一些方法,方法可使用jni介面找到同個程式碼包內的方法,即可通過庫連線android和Unity。

1.編寫編譯庫
這篇文章對jni和ndk有詳細介紹,http://blog.csdn.net/carson_ho/article/details/73250163
我理解的就是,jni是java呼叫C、C++等,或者C、C++呼叫java,ndk是一個工具開發包,使用ndk可以編譯java成庫檔案。

1)配置ndk路徑,一般ndk位於sdk路徑下,如果沒有的話,需要在local.properties中新增配置

ndk.dir=/******/sdk/ndk-bundle

(2)gradle.properties中新增配置

android.useDeprecatedNdk=true

建立程式碼:jni目錄,目錄下三個檔案:

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := androidunity
LOCAL_SRC_FILES := \
com_raudemo_AndroidUnity.c
include $(BUILD_SHARED_LIBRARY)

定義的LOCAL_MODULE

,模組名稱是androidunity

com_raudemo_AndroidUnity.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_raudemo_AndroidUnity */

#ifndef _Included_com_clugbot_AndroidUnity
#define _Included_com_clugbot_AndroidUnity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_clugbot_AndroidUnity
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_clugbot_AndroidUnity_sayHello
  (JNIEnv *, jclass);

int addNum(int a,int b);

#ifdef __cplusplus
}
#endif
#endif

com_raudemo_AndroidUnity.c:

//
// Created by 我的球被偷了 on 2018/2/5.
//


#include <stdio.h>
#include "com_raudemo_AndroidUnity.h"

JNIEXPORT jstring JNICALL Java_com_raudemo_AndroidUnity_sayHello
  (JNIEnv *env, jclass thiz){

  return (*env)->NewStringUTF(env,"aaaaaaa");
  }

int addNum(int a,int b){
    return a+b;
}

編譯:
在命令列jni目錄下執行ndk-build,可生成對應目錄,目錄下包含各cpu架構的庫檔案。
/obj/local/
nm –d libandroidunity.so可以檢視庫內部有哪些方法
2.unity呼叫
在Unity專案下Assets下新建Plugins目錄,目錄下新建Android目錄,將android下生成的libandroidunity.so拷貝至該目錄下,我拷貝的是armeabi-v7a,camera的指令碼Android已經在上面寫好。直接執行。點選按鈕,呼叫外掛成功,dllimport匯入的名稱是jni裡面android.mk的local_model的名稱。
如果報這個錯誤E/Unity: DllNotFoundException: androidunity,說明是外掛沒放對位置。
匯出android包,並貼上到android專案裡面,再次執行,可通訊成功。

程式碼包在系列文章第一篇