UE5.3 虚幻引擎 安卓Android地图插件开发打包

I'm trying to develop Unreal Engine 4 plugin for Android camera API 2.

As I could read on unreal engine forums, there two possibilities to make a plugin for Android.

The first, consist on modifying the UE Android base project (GameActivity).

The second is a standalone plugin, which brings portability to add the plugins in any project.

According to this post, it is possible to make a camera Api1 standalone plugin, which uses APL.xml file to add java code.

But I think it is very limited to a Game activity, like the code below.

复制代码
<?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>

So my questions are:

Is this the only way to make a standalone plugin for Unreal Engine 4?

Is there a XML tag to add custom classes in this APL files?

I found another way to use custom Java classes:

If I am not wrong, the unreal engine _APL.xml file is connected with ANT build system.

So, as in _APL.xml files in addition to define Java code in gameActivityClassAdditions, there is a tag to copy our .java files to Unreal Engine build directory.

I have taken the idea from this Unreal Engine plugin: https://github.com/jeevcat/GoogleMapsUE4Plugin

So, I made a plugin in 4 steps:

  1. Copy the custom java classes to the plugin source directory with package folder order, so the resultant folder structure should be something like this.

2.- Add the prebuilt copies tag to apply the Java class into the build directory:

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

3.- Add the imports in gameActivityImportAdditions:

复制代码
import org.samples.camera2.CameraHandler;

4.- use custom class

复制代码
           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();
            }

Finally I show the resultant _APL.xml file:

复制代码
<?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;
相关推荐
一笑的小酒馆24 分钟前
Android性能优化之截屏时黑屏卡顿问题
android
懒人村杂货铺3 小时前
Android BLE 扫描完整实战
android
TeleostNaCl5 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang95276 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_915918417 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9517 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海7 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿7 小时前
毕业三年后,我离职了
android·面试
编程乐学8 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐9 小时前
Android14 init.rc中on boot阶段操作4
android