原生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。

时间: 2024-10-12 19:22:50

原生Android App项目调用Untiy导出的Android项目的相关文章

Android 项目的代码混淆,Android proguard 使用说明

简单介绍 Java代码是非常easy反编译的. 为了非常好的保护Java源码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码进行缩减体积.优化等,但那些对于我们来说都算是次要的功能. 官网地址:http://proguard.sourceforge.net/ 原理 Java 是一种跨平台的.解释型语言,Java 源码编译成中间"字节码"存储于 class 文件里.因为跨平台的须要,Java 字节码中包

(通用)Android App代码混淆终极解决方案【转】

App虽然没有那么的高大上,但是代码的混淆是代表了程序员对App的责任心, 也是对App安全的一点点保证.今天我会将自己做Android混淆的过程和体会分享给大家,也避免大家少走弯路,少跳坑. 本篇博客混淆基于Android Studio的IDE开发环境. 其实在android Studio中做混淆,基本就是对Proguard-rules.pro文件的操作.混淆的过程也是有规律可循的.下面我将分几个部分来分别介绍混淆过程. (1)如何开启混淆. (2)混淆的公共部分. (3)需要我们不混淆的代码

Android App优化之ANR详解

引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App启动速度之实例挑战 Android App优化之Layout怎么摆 Android App优化之ANR详解 Android App优化之消除卡顿 Android App优化之内存优化 Android App优化之持久电量 Android App优化之如何高效网络请求 App优化系列已近中期, 前面分

用web技术开发出原生的App应用的体会(1)

本人是是个前端小白,学前端已经有半年的时间了,前几天开了个博客,希望记录自己学习历程的点滴. 今天要写的是关于用html,css,javascript等web技术开发原生的app应用. 总所周知,web所写出东西的性能一直被人饱受诟病,这个也是做web开发会一直被轻视的原因之一,那么怎么用web技术开发出较好的有原生一般体验的应用呢?原生的应用开发成本高,而且更新周期短,这就需要用户不断的更新才能使用到原生App的一些新的功能和特性,试想一下,一般的我们的手机安装的应用都在10个以上,那么每隔一

命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”这个问题,如下 跳转到项目的src目录下使用javah命令,而不是在项目的bin/classes目录下使用javah命令即可! 无法访问android.app.Activity是说明没有引入android.jar包可以看看java -h里面的具体说明.其中有一个-bootclasspath

javah编译class文件找不到android.app.Activity的类文件

在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入android.jar包 这边有两种方式可以解决: 第一种:在src目录执行命令,javah -d ../jni com.example.hellojni.HelloJni 其中-d表示输出目录 第二种:使用 bootclasspath参数,让他指定一个android.jar包 如:javah -class

学习android app开发会很难吗?

app开发是一个新兴的技术,也是一个新兴的行业,对于学校以及学生都还是新鲜事物,在概念和课程体系上,我们都没有太多的了解,很多刚开始想学习android app开发的同学都觉得android app开发很难学,那么到底android app开发难学吗? 学习IOS平台的app需要会objective –c语言,学习android则需要java语言,反正无论选择哪个平台,追溯到最基础的层面,C或者C++的基础必须有,这也使得厦门APP开发成为了新兴而高端的课程,这样的课程要说十分好学也谈不上,如果

android夸项目调用

将工程A做成android library project. 设置工程A,右键->Properties->Android,将Is library项选中,然后Apply.设置工程B,右键->Properties->Android,在Library中,点击Add按钮,将A工程加入,然后Apply.此时在B中就引入了A中的资源和代码,这些资源和代码都可以直接调用.需要注意的是,因为A已经不再是一个完整的Android应用,而是一个类库工程,所以有一些内容还需要在B中配置一下.比如A中有l

Android app调用另外一个app

近期公司项目加点东西,调用者是“手机银行” ,被调用者是 “bankeys”,抽个时间随手记录下,其实非常简单 1.调用者: 这个我们可以使用正常的Activity的启动方式,代码如下: Intent intent = new Intent(); intent.setAction("com.bankeys.mobile_sign"); intent.putExtra("data", getReqSignData()); startActivityForResult(