UE4 UPL/JNI 用例: 打开安卓相机

本例使用 UE4.16,实现打开 Android 自带的相机,尽可能用最少的代码来实现,易于理解。

在 Primary game module .Build.cs 里添加,其他模块里写也是一样的。
Module.Build.cs

if (Target.Platform == UnrealTargetPlatform.Android)
{
      PrivateDependencyModuleNames.AddRange(new string[] { "Launch" });
      AdditionalPropertiesForReceipt.Add(new ReceiptProperty("AndroidPlugin", ModuleDirectory + "/OpenCamera_UPL.xml"));
}
新建一个None类,使用单例类或使用静态的 jmethodID 成员,我这里使用的是单例。
xxxx_JNI.h

#include "Core.h"
#include "Runtime/Launch/Public/Android/AndroidJNI.h"
#include "Runtime/ApplicationCore/Public/Android/AndroidApplication.h" // 注意这里在4.18有变动
#include <android_native_app_glue.h>


class FxxxxJNI
{
	jmethodID Method_OpenCamera;

	static FxxxxJNI * Instance;

	FxxxxJNI();
	~FxxxxJNI();


public:
	static FxxxxJNI * Get()
	{
		if (Instance) return Instance;
		else
		{
			Instance = new (std::nothrow) FxxxxJNI();
			return Instance;
		}
	}
	virtual bool OpenCamera();
};
xxxx_JNI.cpp 

FxxxxJNI * FxxxxJNI::Instance(nullptr);

FxxxxJNI::FxxxxJNI()
{
	if (JNIEnv * Env = FAndroidApplication::GetJavaEnv())
	{
		Method_OpenCamera = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_OpenCamera", "()Z", false);
	}
}

bool FxxxxJNI::OpenCamera()
{
	if (JNIEnv * Env = FAndroidApplication::GetJavaEnv())
	{
		return FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, Method_OpenCamera);
	}
	return false;
} 
在.Build.cs 所在目录创建 OpenCamera_UPL.xml 文件,在这里面写打开 Android 相机的功能,直接在 UE4 里写 Android 代码真的是一件很奇妙的事。

<root xmlns:android="http://schemas.android.com/apk/res/android">
  <init>
<log text="OpenCamera INIT"/>
  </init>

  <proguardAdditions>
<insert>
</insert>
  </proguardAdditions>

  <prebuildCopies>
<copyDir src="$S(PluginDir)/../../ThirdPartyLibraries/Android"dst="$S(BuildDir)" />
  </prebuildCopies>

  <gameActivityImportAdditions>
    <insert>

        import android.content.Intent;
     </insert>
  </gameActivityImportAdditions>


  <androidManifestUpdates>
  <addPermission android:name="android.permission.READ_PHONE_STATE" />
  </androidManifestUpdates>

    <gameActivityClassAdditions>
<insert>

        //调用相机
        public boolean AndroidThunkJava_OpenCamera() 
        {
            Intent intent = new Intent(); 
            intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
            startActivity(intent);
            return true;
        }
</insert>
  </gameActivityClassAdditions>

</root>





版权声明:本文为RhyGame原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。