forked from geode-sdk/android-launcher
implement enough to launch 2.2 (#2)
* generic maintenance and allow armv8 * implement missing java functions * Update build.yml * add missing audiodevice code * split apk support * ignore (gitignore) * replace library load with native code * set supported abis again --------- Co-authored-by: alk <45172705+altalk23@users.noreply.github.com>
This commit is contained in:
1 parent
c08ae0ec13
commit
c85470013f
24 files changed
+522
-252
No files matched your search
@@ -9,6 +9,7 @@ import android.net.NetworkCapabilities
|
||||
import android.net.Uri
|
||||
import android.provider.Settings
|
||||
import android.util.Log
|
||||
import android.view.WindowManager
|
||||
import android.widget.Toast
|
||||
import com.customRobTop.JniToCpp.resumeSound
|
||||
import org.cocos2dx.lib.Cocos2dxGLSurfaceView.Companion.closeIMEKeyboard
|
||||
@@ -127,6 +128,11 @@ object BaseRobTopActivity {
|
||||
isLoaded = true
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getDeviceRefreshRate(): Float {
|
||||
return (me.get()?.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay.refreshRate
|
||||
}
|
||||
|
||||
// Everyplay doesn't even exist anymore lol
|
||||
@JvmStatic
|
||||
fun setupEveryplay() {}
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.pm.PackageInfo
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
@@ -44,7 +45,6 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
private var mHasWindowFocus = false
|
||||
private var mReceiver: BroadcastReceiver? = null
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
setupUIState()
|
||||
|
||||
@@ -57,7 +57,6 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
}
|
||||
|
||||
val gdPackageInfo = packageManager.getPackageInfo(Constants.PACKAGE_NAME, 0)
|
||||
val gdNativeLibraryPath = "${gdPackageInfo.applicationInfo.nativeLibraryDir}/"
|
||||
|
||||
try {
|
||||
LaunchUtils.addAssetsFromPackage(assets, gdPackageInfo)
|
||||
@@ -86,8 +85,8 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
Cocos2dxHelper.init(this, this)
|
||||
GeodeUtils.setContext(this)
|
||||
|
||||
System.load("$gdNativeLibraryPath/lib${Constants.FMOD_LIB_NAME}.so")
|
||||
System.load("$gdNativeLibraryPath/lib${Constants.COCOS_LIB_NAME}.so")
|
||||
tryLoadLibrary(gdPackageInfo, Constants.FMOD_LIB_NAME)
|
||||
tryLoadLibrary(gdPackageInfo, Constants.COCOS_LIB_NAME)
|
||||
|
||||
if (getLoadTesting()) {
|
||||
loadTestingLibraries()
|
||||
@@ -114,6 +113,44 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
private fun tryLoadLibrary(packageInfo: PackageInfo, libraryName: String) {
|
||||
try {
|
||||
val nativeDir = packageInfo.applicationInfo.nativeLibraryDir
|
||||
System.load("$nativeDir/lib$libraryName.so")
|
||||
} catch (ule: UnsatisfiedLinkError) {
|
||||
loadLibraryFromAssets(libraryName)
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadLibraryFromAssets(libraryName: String) {
|
||||
// loads a library loaded in assets (which points to the apk + an offset)
|
||||
// these libraries are available to the application after merging
|
||||
|
||||
// find the first instance of the library in preferred abi order
|
||||
val libraryFd = Build.SUPPORTED_ABIS.asSequence()
|
||||
.mapNotNull {
|
||||
try {
|
||||
assets.openNonAssetFd("lib/$it/lib$libraryName.so")
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
.firstOrNull() ?: throw UnsatisfiedLinkError("Could not find library lib$libraryName.so")
|
||||
|
||||
val fdOffset = libraryFd.startOffset
|
||||
val fdDescriptor = libraryFd.parcelFileDescriptor.detachFd()
|
||||
|
||||
if (!LauncherFix.loadLibraryFromOffset("lib$libraryName.so", fdDescriptor, fdOffset)) {
|
||||
throw UnsatisfiedLinkError("Failed to load asset lib$libraryName.so")
|
||||
}
|
||||
|
||||
// after the library is opened in native code, it should be available for loading
|
||||
// you can read more about the behavior:
|
||||
// https://android.googlesource.com/platform/libcore/+/7f3eb2e0ac87bdea471bc577380cf50025aebde5/ojluni/src/main/java/java/lang/Runtime.java#1060
|
||||
System.loadLibrary(libraryName)
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
private fun loadGeodeLibrary(): Boolean {
|
||||
// Load Geode if exists
|
||||
|
||||
@@ -10,4 +10,6 @@ object LauncherFix {
|
||||
external fun setDataPath(dataPath: String)
|
||||
|
||||
external fun setOriginalDataPath(dataPath: String)
|
||||
|
||||
external fun loadLibraryFromOffset(libraryName: String, fd: Int, offset: Long): Boolean
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import android.content.pm.PackageInfo
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.AssetManager
|
||||
import android.content.Context
|
||||
import com.geode.launcher.utils.Constants
|
||||
import java.io.File
|
||||
|
||||
object LaunchUtils {
|
||||
@@ -45,6 +44,10 @@ object LaunchUtils {
|
||||
// (the source recommends replacing with AssetManager.setApkAssets(ApkAssets[], boolean) lol)
|
||||
val clazz = assetManager.javaClass
|
||||
val aspMethod = clazz.getDeclaredMethod("addAssetPath", String::class.java)
|
||||
|
||||
aspMethod.invoke(assetManager, packageInfo.applicationInfo.sourceDir)
|
||||
packageInfo.applicationInfo.splitSourceDirs?.forEach {
|
||||
aspMethod.invoke(assetManager, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user