使用 APL(Android 编程语言)制作 Android 插件到 Unreal Engine 4
Use APL (Android Programming Language) to make Android plugin to Unreal Engine 4
我正在尝试为 Android 相机开发 Unreal Engine 4 插件 API 2.
正如我在 unreal engine 论坛上看到的那样,为 Android 制作插件有两种可能性。
首先,修改 UE Android 基础项目 (GameActivity)。
第二个是独立插件,它带来了可移植性,可以在任何项目中添加插件。
根据这个post,可以制作一个相机Api1独立插件,它使用APL.xml文件添加java代码。
但我认为它非常局限于游戏activity,如下面的代码。
<?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>
所以我的问题是:
这是为 Unreal Engine 4 制作独立插件的唯一方法吗?
在这个 APL 文件中是否有 XML 标签来添加自定义 类?
我找到了另一种使用自定义 Java class 的方法:
如果我没记错,unreal engine _APL.xml 文件与 ANT 构建系统连接。
因此,在 _APL.xml 文件中,除了在 gameActivityClassAdditions 中定义 Java 代码外,还有一个标签可以将我们的 .java 文件复制到 Unreal Engine 构建目录.
我从这个 Unreal Engine 插件中得到了灵感:
https://github.com/jeevcat/GoogleMapsUE4Plugin
所以,我分4步做了一个插件:
- 将自定义的java classes复制到包文件夹顺序的插件源目录,所以生成的文件夹结构应该是这样的。
2.- 添加预构建副本标签以将 Java class 应用到构建目录中:
<prebuildCopies>
<copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" />
</prebuildCopies>
3.- 在 gameActivityImportAdditions 中添加导入:
import org.samples.camera2.CameraHandler;
4.- 使用自定义 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();
}
最后我展示了生成的 _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>
我正在尝试为 Android 相机开发 Unreal Engine 4 插件 API 2.
正如我在 unreal engine 论坛上看到的那样,为 Android 制作插件有两种可能性。
首先,修改 UE Android 基础项目 (GameActivity)。
第二个是独立插件,它带来了可移植性,可以在任何项目中添加插件。
根据这个post,可以制作一个相机Api1独立插件,它使用APL.xml文件添加java代码。
但我认为它非常局限于游戏activity,如下面的代码。
<?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>
所以我的问题是:
这是为 Unreal Engine 4 制作独立插件的唯一方法吗?
在这个 APL 文件中是否有 XML 标签来添加自定义 类?
我找到了另一种使用自定义 Java class 的方法:
如果我没记错,unreal engine _APL.xml 文件与 ANT 构建系统连接。
因此,在 _APL.xml 文件中,除了在 gameActivityClassAdditions 中定义 Java 代码外,还有一个标签可以将我们的 .java 文件复制到 Unreal Engine 构建目录.
我从这个 Unreal Engine 插件中得到了灵感: https://github.com/jeevcat/GoogleMapsUE4Plugin
所以,我分4步做了一个插件:
- 将自定义的java classes复制到包文件夹顺序的插件源目录,所以生成的文件夹结构应该是这样的。
2.- 添加预构建副本标签以将 Java class 应用到构建目录中:
<prebuildCopies> <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" /> </prebuildCopies>
3.- 在 gameActivityImportAdditions 中添加导入:
import org.samples.camera2.CameraHandler;
4.- 使用自定义 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();
}
最后我展示了生成的 _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>