原生Android App項目調用Untiy導出的Android項目


背景:采用Google VR SDK for Unity 開發3D場景功能,然后導出Android項目,合並到一個Android App里面,供其它Activity調用。

  • 用Google VR for Unity SDK開發的Untiy項目導出來的Android項目,主Activity為com.google.unity.GoogleUnityActivity。如果需要在此基礎上擴展一些功能,則需要實現自己的Activity(比如命名為GoogleCardboardActivity),並繼承com.google.unity.GoogleUnityActivity,並把AndroidManifest.xml里面的主Activity修改為自己實現的Activity(比如剛才創建的GoogleCardboardActivity)。
  • 如果把主Activity替換成UnityPlayerActivity,則調用Untiy場景時,出來的內容看不到Cardboard的UI(返回按鈕,中間的分割線,以及設置按鈕)。
  • 從Android Activity調用GoogleUnityActivity的代碼如下:
    1 Intent googleUnityIntent = new Intent(this, GoogleUnityActivity.class);
    2 AndroidActivity.this.startActivity(googleUnityIntent);
    3 AndroidActivity.this.finish();

    如果是自定義的Activity,則將GoogleUnityActivity.class替換成自定義的Activity.class。

  • 在Unity場景中調用GoogleUnityActivity定義的方法:
    1 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    2 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    3 jo.Call("someAndroidMethod");

    someAndroidMethod為寫在GoogleUnityActivity中的Android方法。

  • 如果該Android方法中需要調用到mUnityPlayer,則需要把調用mUnityPlayer的代碼寫在Android的UI線程里面,否則會出錯:

    1 public void someAndroidMethod() {
    2     runOnUiThread(new Runnable() {
    3         @Override
    4         public void run() {
    5           mUnityPlayer.quit();
    6         }
    7     });
    8 }
  • couldn't find "libgvrunity.so"
    AndroidRuntime: FATAL EXCEPTION: main
    Process: com.elfnaga.googlecardboard, PID: 6401
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.elfnaga.googlecardboard-1/base.apk"],nativeLibraryDirectories=[/data/app/com.elfnaga.googlecardboard-1/lib/arm64, /data/app/com.elfnaga.googlecardboard-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libgvrunity.so"
           at java.lang.Runtime.loadLibrary(Runtime.java:367)
           at java.lang.System.loadLibrary(System.java:1076)
           at com.google.unity.GoogleUnityActivity.<clinit>(GoogleUnityActivity.java:55)
           at java.lang.Class.newInstance(Native Method)
           at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374)
           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
           at android.app.ActivityThread.access$1100(ActivityThread.java:154)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1396)
           at android.os.Handler.dispatchMessage(Handler.java:102)
           at android.os.Looper.loop(Looper.java:148)
           at android.app.ActivityThread.main(ActivityThread.java:5582)
           at java.lang.reflect.Method.invoke(Native Method)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    12-01 10:20:38.089 13512-14679/? W/ActivityManager:   Force finishing activity com.elfnaga.googlecardboard/com.google.unity.GoogleUnityActivity

    原因是Google VR SDK for Unity中的libgvrunity.so只提供了armv7版和x86版,沒有提供arm64版本,所以需要修改Android項目中的build.gradle,添加產品偏好:

     1 android {
     2     productFlavors {
     3         armv7 {
     4             ndk {
     5                 abiFilter "armeabi-v7a"
     6             }
     7         }
     8         x86 {
     9             ndk {
    10                 abiFilter "x86"
    11             }
    12         }
    13         fat
    14     }
    15 }

    則不會出現找不到libgvrunity.so。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM