react-native-android-unity(三)android原生和unity互相通訊
阿新 • • 發佈:2018-12-17
一、android向unity傳送訊息
這個比較比較簡單,unity匯出android的程式碼包,顳部提供了介面,在UnityActivity加入如下程式碼:mUnityPlayer.UnitySendMessage("Main Camera", "CalledFromAndroid", label);
第一個引數是物件,第二個引數是呼叫的腳本里面的方法,第三個引數是傳輸的string。實現效果是android輸入字元,點選傳遞訊息,unity的按鍵和label內容變化。
原理是unity匯出的包,自己封裝了許多方法,需要找到object,和上面掛載的指令碼內的函式方法,即可傳資料。
二、unity
這個稍微複雜點,我理解的是最終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
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專案裡面,再次執行,可通訊成功。
程式碼包在系列文章第一篇