Use minidns for android to fix starting crash
This commit is contained in:
parent
cf6225e3ae
commit
7598dc7b37
@ -39,3 +39,8 @@ android
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies
|
||||||
|
{
|
||||||
|
implementation 'org.minidns:minidns-hla:0.3.3'
|
||||||
|
}
|
||||||
|
@ -19,6 +19,12 @@ import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.minidns.hla.DnssecResolverApi;
|
||||||
|
import org.minidns.hla.ResolverResult;
|
||||||
|
import org.minidns.record.TXT;
|
||||||
|
|
||||||
public class SuperTuxKartActivity extends NativeActivity
|
public class SuperTuxKartActivity extends NativeActivity
|
||||||
{
|
{
|
||||||
private STKEditText m_stk_edittext;
|
private STKEditText m_stk_edittext;
|
||||||
@ -218,4 +224,24 @@ public class SuperTuxKartActivity extends NativeActivity
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
public String[] getDNSTxtRecords(String domain)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ResolverResult<TXT> txts =
|
||||||
|
DnssecResolverApi.INSTANCE.resolve(domain, TXT.class);
|
||||||
|
Set<TXT> ans = txts.getAnswers();
|
||||||
|
String[] result = new String[ans.size()];
|
||||||
|
int i = 0;
|
||||||
|
for (TXT t : ans)
|
||||||
|
result[i++] = t.getText();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,6 +91,7 @@ namespace irr
|
|||||||
static const AndroidApplicationInfo& getApplicationInfo(
|
static const AndroidApplicationInfo& getApplicationInfo(
|
||||||
ANativeActivity* activity);
|
ANativeActivity* activity);
|
||||||
void openURL(const std::string& url);
|
void openURL(const std::string& url);
|
||||||
|
android_app* getAndroid() const { return Android; }
|
||||||
private:
|
private:
|
||||||
s32 m_moved_height;
|
s32 m_moved_height;
|
||||||
u32 m_screen_height;
|
u32 m_screen_height;
|
||||||
|
@ -42,6 +42,12 @@
|
|||||||
#include "utils/string_utils.hpp"
|
#include "utils/string_utils.hpp"
|
||||||
#include "utils/translation.hpp"
|
#include "utils/translation.hpp"
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "../../../lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h"
|
||||||
|
#include "graphics/irr_driver.hpp"
|
||||||
|
#include "utils/utf8/unchecked.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
# include <windns.h>
|
# include <windns.h>
|
||||||
# include <ws2tcpip.h>
|
# include <ws2tcpip.h>
|
||||||
@ -512,6 +518,119 @@ bool ConnectToServer::registerWithSTKServer()
|
|||||||
}
|
}
|
||||||
} // registerWithSTKServer
|
} // registerWithSTKServer
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
auto get_txt_record = [](const core::stringw& name)->std::vector<std::string>
|
||||||
|
{
|
||||||
|
std::vector<std::string> result;
|
||||||
|
CIrrDeviceAndroid* dev =
|
||||||
|
dynamic_cast<CIrrDeviceAndroid*>(irr_driver->getDevice());
|
||||||
|
if (!dev)
|
||||||
|
return result;
|
||||||
|
android_app* android = dev->getAndroid();
|
||||||
|
if (!android)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
bool was_detached = false;
|
||||||
|
JNIEnv* env = NULL;
|
||||||
|
|
||||||
|
jint status = android->activity->vm->GetEnv((void**)&env, JNI_VERSION_1_6);
|
||||||
|
if (status == JNI_EDETACHED)
|
||||||
|
{
|
||||||
|
JavaVMAttachArgs args;
|
||||||
|
args.version = JNI_VERSION_1_6;
|
||||||
|
args.name = "NativeThread";
|
||||||
|
args.group = NULL;
|
||||||
|
|
||||||
|
status = android->activity->vm->AttachCurrentThread(&env, &args);
|
||||||
|
was_detached = true;
|
||||||
|
}
|
||||||
|
if (status != JNI_OK)
|
||||||
|
{
|
||||||
|
Log::error("ConnectToServer",
|
||||||
|
"Cannot attach current thread in getDNSTxtRecords.");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
jobject native_activity = android->activity->clazz;
|
||||||
|
jclass class_native_activity = env->GetObjectClass(native_activity);
|
||||||
|
|
||||||
|
if (class_native_activity == NULL)
|
||||||
|
{
|
||||||
|
Log::error("ConnectToServer",
|
||||||
|
"getDNSTxtRecords unable to find object class.");
|
||||||
|
if (was_detached)
|
||||||
|
{
|
||||||
|
android->activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
jmethodID method_id = env->GetMethodID(class_native_activity,
|
||||||
|
"getDNSTxtRecords", "(Ljava/lang/String;)[Ljava/lang/String;");
|
||||||
|
|
||||||
|
if (method_id == NULL)
|
||||||
|
{
|
||||||
|
Log::error("ConnectToServer",
|
||||||
|
"getDNSTxtRecords unable to find method id.");
|
||||||
|
if (was_detached)
|
||||||
|
{
|
||||||
|
android->activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint16_t> jstr_data;
|
||||||
|
utf8::unchecked::utf32to16(
|
||||||
|
name.c_str(), name.c_str() + name.size(), std::back_inserter(jstr_data));
|
||||||
|
jstring text =
|
||||||
|
env->NewString((const jchar*)jstr_data.data(), jstr_data.size());
|
||||||
|
if (text == NULL)
|
||||||
|
{
|
||||||
|
Log::error("ConnectToServer",
|
||||||
|
"Failed to create text for domain name.");
|
||||||
|
if (was_detached)
|
||||||
|
{
|
||||||
|
android->activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
jobjectArray arr =
|
||||||
|
(jobjectArray)env->CallObjectMethod(native_activity, method_id, text);
|
||||||
|
if (arr == NULL)
|
||||||
|
{
|
||||||
|
Log::error("ConnectToServer", "No array is created.");
|
||||||
|
if (was_detached)
|
||||||
|
{
|
||||||
|
android->activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int len = env->GetArrayLength(arr);
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
jstring jstr = (jstring)(env->GetObjectArrayElement(arr, i));
|
||||||
|
if (!jstr)
|
||||||
|
continue;
|
||||||
|
const uint16_t* utf16_text =
|
||||||
|
(const uint16_t*)env->GetStringChars(jstr, NULL);
|
||||||
|
if (utf16_text == NULL)
|
||||||
|
continue;
|
||||||
|
const size_t str_len = env->GetStringLength(jstr);
|
||||||
|
std::string tmp;
|
||||||
|
utf8::unchecked::utf16to8(
|
||||||
|
utf16_text, utf16_text + str_len, std::back_inserter(tmp));
|
||||||
|
result.push_back(tmp);
|
||||||
|
env->ReleaseStringChars(jstr, utf16_text);
|
||||||
|
}
|
||||||
|
if (was_detached)
|
||||||
|
{
|
||||||
|
android->activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
bool ConnectToServer::detectPort()
|
bool ConnectToServer::detectPort()
|
||||||
{
|
{
|
||||||
@ -541,7 +660,7 @@ bool ConnectToServer::detectPort()
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
#ifdef WIN32
|
#if defined(WIN32)
|
||||||
PDNS_RECORD dns_record = NULL;
|
PDNS_RECORD dns_record = NULL;
|
||||||
DnsQuery(m_server->getName().c_str(), DNS_TYPE_TEXT,
|
DnsQuery(m_server->getName().c_str(), DNS_TYPE_TEXT,
|
||||||
DNS_QUERY_STANDARD, NULL, &dns_record, NULL);
|
DNS_QUERY_STANDARD, NULL, &dns_record, NULL);
|
||||||
@ -565,6 +684,14 @@ bool ConnectToServer::detectPort()
|
|||||||
}
|
}
|
||||||
DnsRecordListFree(dns_record, DnsFreeRecordListDeep);
|
DnsRecordListFree(dns_record, DnsFreeRecordListDeep);
|
||||||
}
|
}
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
std::vector<std::string> txt_records = get_txt_record(m_server->getName());
|
||||||
|
for (auto& txt_record : txt_records)
|
||||||
|
{
|
||||||
|
port_from_dns = get_port(txt_record);
|
||||||
|
if (port_from_dns != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
unsigned char response[512] = {};
|
unsigned char response[512] = {};
|
||||||
const std::string& utf8name = StringUtils::wideToUtf8(m_server->getName());
|
const std::string& utf8name = StringUtils::wideToUtf8(m_server->getName());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user