通过看模板代码文件:GameActivity.java.template
(路径:\Engine\Build\Android\Java\src\com\epicgames\unreal\GameActivity.java.template)
或者已构建过安卓包的,可直接看GameActivity.java
(项目名\Intermediate\Android\arm64\gradle\app\src\main\java\com\epicgames\unreal\GameActivity.java)
方法1:
OnCreate函数里有调用processSystemInfo函数;
@Override
public void onCreate(Bundle savedInstanceState)
{
..........................
//$${gameActivityBeforeConfigRulesAppliedAdditions}$$
// run configuration rules
if (!processSystemInfo(ProjectName, appPackageName))
{
// configuration failed (show error)
return;
}
...........................
}
而processSystemInfo函数里有通过nativeSetConfigRulesVariables函数传递设备信息到C++层
private boolean processSystemInfo(String ProjectName, String PackageName)
{
......................................
Map<String, String> variables = new HashMap<String, String>();
ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
int totalMemory = (int)(memoryInfo.totalMem / 1024 / 1024);
Log.debug("Memory: " + totalMemory + " MB");
variables.put("memory", Integer.toString(totalMemory));
//variables.put("Profile", "Android");
variables.put("versionCode", Integer.toString(VersionCode));
variables.put("versionName", VersionName);
variables.put("targetSdkVersion", Integer.toString(targetSdkVersion));
variables.put("unsupportedDevice", "false");
variables.put("OverrideProfile", "true");
variables.put("hardware", hardware);
variables.put("ro.hardware", roHardware);
variables.put("ro.soc.model", roSOCModel);
variables.put("processor", processor);
variables.put("processorCount", Integer.toString(processorCount));
variables.put("useAffinity", "false");
variables.put("hasNEON", bHasNEON ? "true" : "false");
variables.put("isARM64", bIsARM64 ? "true" : "false");
variables.put("littleCoreMask", "0x0");
variables.put("bigCoreMask", "0xffff");
variables.put("SRC_GpuFamily", OpenGLDevice);
variables.put("SRC_GlVersion", OpenGLDriver);
variables.put("SRC_AndroidVersion", android.os.Build.VERSION.RELEASE);
variables.put("SRC_DeviceMake", android.os.Build.MANUFACTURER);
variables.put("SRC_DeviceModel", android.os.Build.MODEL);
variables.put("SRC_DeviceBuildNumber", android.os.Build.DISPLAY);
variables.put("SRC_VulkanVersion", VulkanVersionString);
variables.put("SRC_VulkanAvailable", (bSupportsVulkan && VulkanVersionString != "0.0.0") ? "true" : "false"); // commandline could still disable!
variables.put("SRC_UsingHoudini", bHasHoudini ? "true" : "false");
variables.put("SRC_HMDSystemName", "");
variables.put("SRC_GpuVendor", OpenGLVendor);
variables.put("SRC_SDKLevel", Integer.toString(android.os.Build.VERSION.SDK_INT));
variables.put("supportsFloatingPointRenderTargets", bSupportsFloatingPointRenderTargets ? "true" : "false");
variables.put("TextureFormats", TextureFormats);
.................
nativeSetConfigRulesVariables(keyValues);
//$${gameActivityPostConfigRulesAdditions}$$
//$${gameActivityFinalizeConfigRulesAdditions}$$
return !bForceGameEndWithError;
}
同时可以看引擎源码里,
在C++层的AndroidPlatformMisc.cpp文件可见(UnrealEngine\Engine\Source\Runtime\Core\Private\Android\AndroidPlatformMisc.cpp)
传递过来的所有键值对都存在FAndroidMisc::ConfigRulesVariables里。
JNI_METHOD void Java_com_epicgames_unreal_GameActivity_nativeSetConfigRulesVariables(JNIEnv* jenv, jobject thiz, jobjectArray KeyValuePairs)
{
int32 Count = jenv->GetArrayLength(KeyValuePairs);
int32 Index = 0;
while (Index < Count)
{
auto javaKey = FJavaHelper::FStringFromLocalRef(jenv, (jstring)(jenv->GetObjectArrayElement(KeyValuePairs, Index++)));
auto javaValue = FJavaHelper::FStringFromLocalRef(jenv, (jstring)(jenv->GetObjectArrayElement(KeyValuePairs, Index++)));
FAndroidMisc::ConfigRulesVariables.Add(javaKey, javaValue);
}
}
所以我们可以通过GetConfigRulesVariable,传目标key值,即可获取对应的设备信息。
FString* FAndroidMisc::GetConfigRulesVariable(const FString& Key)
{
return ConfigRulesVariables.Find(Key);
}
方法2:只局限部分参数
还是在GameActivity的OnCreate函数里找到:
@Override
public void onCreate(Bundle savedInstanceState)
{
....................
nativeSetAndroidVersionInformation( android.os.Build.VERSION.RELEASE, targetSdkVersion, android.os.Build.MANUFACTURER, android.os.Build.MODEL, android.os.Build.DISPLAY, Language );
.................
}
同时看引擎源码
LaunchAndroid.cpp
(UnrealEngine\Engine\Source\Runtime\Launch\Private\Android\LaunchAndroid.cpp)
JNI_METHOD void Java_com_epicgames_unreal_GameActivity_nativeSetAndroidVersionInformation(JNIEnv* jenv, jobject thiz, jstring androidVersion, jint targetSDKversion, jstring phoneMake, jstring phoneModel, jstring phoneBuildNumber, jstring osLanguage)
{
auto UEAndroidVersion = FJavaHelper::FStringFromParam(jenv, androidVersion);
auto UEPhoneMake = FJavaHelper::FStringFromParam(jenv, phoneMake);
auto UEPhoneModel = FJavaHelper::FStringFromParam(jenv, phoneModel);
auto UEPhoneBuildNumber = FJavaHelper::FStringFromParam(jenv, phoneBuildNumber);
auto UEOSLanguage = FJavaHelper::FStringFromParam(jenv, osLanguage);
FAndroidMisc::SetVersionInfo(UEAndroidVersion, targetSDKversion, UEPhoneMake, UEPhoneModel, UEPhoneBuildNumber, UEOSLanguage);
}
AndroidPlatformMisc.cpp文件(UnrealEngine\Engine\Source\Runtime\Core\Private\Android\AndroidPlatformMisc.cpp)
void FAndroidMisc::SetVersionInfo( FString InAndroidVersion, int32 InTargetSDKVersion, FString InDeviceMake, FString InDeviceModel, FString InDeviceBuildNumber, FString InOSLanguage )
{
AndroidVersion = InAndroidVersion;
AndroidMajorVersion = FCString::Atoi(*InAndroidVersion);
TargetSDKVersion = InTargetSDKVersion;
DeviceMake = InDeviceMake;
DeviceModel = InDeviceModel;
DeviceBuildNumber = InDeviceBuildNumber;
OSLanguage = InOSLanguage;
UE_LOG(LogAndroid, Display, TEXT("Android Version Make Model BuildNumber Language: %s %s %s %s %s"), *AndroidVersion, *DeviceMake, *DeviceModel, *DeviceBuildNumber, *OSLanguage);
}
.................................................
const FString FAndroidMisc::GetDeviceModel()
{
return DeviceModel;
}
PS:实际使用比如
FString* andModel = FAndroidMisc::GetConfigRulesVariable(TEXT("SRC_DeviceModel"));//获取model方法1
FString andModel2 = FAndroidMisc::GetDeviceModel();//获取model方法2
std::string jsonInfo("{\"Model\":\"");
jsonInfo.append(TCHAR_TO_UTF8(**andModel));
//jsonInfo.append(TCHAR_TO_UTF8(*andModel2));
jsonInfo.append("\"}");
UE_LOG(LogTemp, Display, TEXT("Android:: %s"),UTF8_TO_TCHAR(jsonInfo.c_str()));