【问题标题】:Use APL (Android Programming Language) to make Android plugin to Unreal Engine 4使用APL(Android Programming Language)制作Android插件到Unreal Engine 4
【发布时间】:2017-03-02 09:17:13
【问题描述】:

我正在尝试为 Android 相机 API 2 开发 Unreal Engine 4 插件。

正如我在虚幻引擎论坛上看到的那样,为 Android 制作插件有两种可能性。

首先,修改 UE Android 基础项目(GameActivity)。

第二个是一个独立的插件,它带来了在任何项目中添加插件的可移植性。

根据这个post,可以制作一个camera Api1独立插件,使用APL.xml文件添加java代码。

但我认为它仅限于游戏活动,如下面的代码。

<?xml version="1.0" encoding="utf-8"?>
<!--ARToolKit plugin additions-->
<root xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- init section is always evaluated once per architecture -->
 <init>
   <log text="AndroidCamera init"/>
 </init>

 <androidManifestUpdates>
   <addPermission android:name="android.permission.CAMERA"/>
   <addFeature android:name="android.hardware.camera"/>
   <addFeature android:name="android.hardware.camera.autofocus"/>
 </androidManifestUpdates>

 <!-- optional additions to the GameActivity imports in GameActivity.java -->
 <gameActivityImportAdditions>
   <insert>
import android.widget.Toast;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.graphics.SurfaceTexture;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import java.util.List; 
import java.io.IOException;
import android.util.Log;
   </insert>
 </gameActivityImportAdditions>

 <gameActivityClassAdditions>
   <insert>
     static String msg = "yes i am a rock!";
     SurfaceTexture surfaceTexture;
     Camera camera;
     public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data);

     public void AndroidThunkJava_Toast()
     {
       try
       {
         _activity.runOnUiThread(new Runnable()
         {
           public void run()
           {
             Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show();
           }
         });
       }
       catch (Exception e)
       {
         Log.debug("Toast failed with exception " + e.getMessage());
       }
     }

     public void AndroidThunkJava_startCamera()
     {
       surfaceTexture = new SurfaceTexture(10);
       surfaceTexture.setDefaultBufferSize(320,240);
       camera = Camera.open();


       try { 
         camera.setPreviewTexture(surfaceTexture);
       } catch (IOException t) {
         android.util.Log.e("ARToolKitLog", "Cannot set preview texture target!", t);
       } 

       Parameters cameraParam = camera.getParameters();

       cameraParam.setPreviewFormat(ImageFormat.NV21);
       cameraParam.setPreviewSize(320, 240);
       camera.setParameters(cameraParam);

       camera.setPreviewCallback(new PreviewCallback() {
         @Override
         public void onPreviewFrame(byte[] data, Camera camera) {
           int Height = camera.getParameters().getPreviewSize().height;
           int Width = camera.getParameters().getPreviewSize().width;
           nativeGetFrameData(Width, Height, data);
         }
       });

       camera.startPreview();
     }

     public void AndroidThunkJava_stopCamera()
     {
       if (camera != null) 
       {
         camera.stopPreview();
         camera.release();
         camera = null;
       }
     }
   </insert>
 </gameActivityClassAdditions>

 <!-- optional additions to GameActivity onCreate in GameActivity.java -->
 <gameActivityOnCreateAdditions>
   <insert>
   //Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
   //AndroidThunkJava_Toast();
   </insert>
 </gameActivityOnCreateAdditions>


</root>

所以我的问题是:

这是为虚幻引擎 4 制作独立插件的唯一方法吗?

此 APL 文件中是否有用于添加自定义类的 XML 标记?

【问题讨论】:

    标签: android unreal-engine4 android-camera2


    【解决方案1】:

    我找到了另一种使用自定义 Java 类的方法:

    如果我没记错的话,虚幻引擎_APL.xml文件是和ANT构建系统连接的。

    所以,就像在_APL.xml 文件中一样,除了在gameActivityClassAdditions 中定义Java 代码外,还有一个标签可以将我们的.java 文件复制到虚幻引擎构建目录。

    我从这个虚幻引擎插件中汲取了灵感: https://github.com/jeevcat/GoogleMapsUE4Plugin

    所以,我分四步制作了一个插件:

    1. 按照包文件夹顺序将自定义java类复制到插件源目录,因此生成的文件夹结构应该是这样的。

    2.- 添加预构建副本标签以将 Java 类应用到构建目录:

    <prebuildCopies>
            <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" />
    </prebuildCopies>
    

    3.- 在 gameActivityImportAdditions 中添加导入:

    import org.samples.camera2.CameraHandler;
    

    4.- 使用自定义类

               public void AndroidThunkJava_startCamera()
                {
                            m_camHandler = new CameraHandler();
                            m_camHandler.setCallback(new CameraCallback() {
                            @Override
                            public void onGetFrame(byte[] data, int width, int height) {
                                Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width);
                                nativeGetFrameData(width, height, data);
                            }
                });
                m_camHandler.init(_activity, 0, 320, 240);
                m_camHandler.start();
                }
    

    最后我展示了生成的 _APL.xml 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <!--ARToolKit plugin additions-->
    <root xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- init section is always evaluated once per architecture -->
        <init>
            <log text="AndroidCamera init"/>
        </init>
    
    <androidManifestUpdates>
            <addPermission android:name="android.permission.CAMERA"  />
            <addFeature android:name="android.hardware.camera"  />
            <addFeature android:name="android.hardware.camera.autofocus"  />
            <addFeature android:name="android.hardware.camera2" />
    </androidManifestUpdates>
    
    <prebuildCopies>
            <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" />
    </prebuildCopies>
    
        <!-- optional additions to the GameActivity imports in GameActivity.java -->
        <gameActivityImportAdditions>
            <insert>
    import android.widget.Toast;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    import android.hardware.Camera.Parameters;
    import android.hardware.Camera.PreviewCallback;
    import android.graphics.SurfaceTexture;
    import android.graphics.ImageFormat;
    import android.graphics.PixelFormat;
    import java.util.List;
    import java.io.IOException;
    import android.util.Log;
    
    import org.samples.camera2.CameraHandler;
            </insert>
        </gameActivityImportAdditions>
    
        <gameActivityClassAdditions>
            <insert>
                static String msg = "yes i am a rock!";
                SurfaceTexture surfaceTexture;
                Camera camera;
                CameraHandler m_camHandler;
                public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data);
    
                public void AndroidThunkJava_Toast()
                {
                    try
                    {
                        _activity.runOnUiThread(new Runnable()
                        {
                            public void run()
                            {
                                Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                    catch (Exception e)
                    {
                        Log.debug("Toast failed with exception " + e.getMessage());
                    }
                }
    
                public void AndroidThunkJava_startCamera()
                {
                m_camHandler = new CameraHandler();
                m_camHandler.setCallback(new CameraCallback() {
                @Override
                public void onGetFrame(byte[] data, int width, int height) {
                                         Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width);
                                         nativeGetFrameData(width, height, data);
                                 }
                         });
                m_camHandler.init(_activity, 0, 320, 240);
                m_camHandler.start();
                }
                public void AndroidThunkJava_stopCamera()
                {
    
                }
            </insert>
        </gameActivityClassAdditions>
    
        <!-- optional additions to GameActivity onCreate in GameActivity.java -->
        <gameActivityOnCreateAdditions>
            <insert>
            </insert>
        </gameActivityOnCreateAdditions>
    </root>
    

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 2014-11-29
      • 2017-01-16
      • 1970-01-01
      • 2020-08-09
      • 2015-02-12
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      相关资源
      最近更新 更多