Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,16 @@ compile_commands.json
*~
*.log
memcards/

# Android/Gradle
.gradle/
local.properties
**/build/
**/.cxx/
*.apk
*.aar
.navigation/
captures/
*.keystore
!debug.keystore

41 changes: 29 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
cmake_minimum_required(VERSION 3.20)
project(CTR-Native C)
project(CTR-Native C CXX)
include(CheckCCompilerFlag)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
set(CTR_NATIVE_VERSION "0.1.0-beta.7.1")

if(NOT CMAKE_C_COMPILER_TARGET MATCHES "i.86" AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "i.86")
set(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
if(NOT ANDROID)
if(NOT CMAKE_C_COMPILER_TARGET MATCHES "i.86" AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "i.86")
set(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
endif()
endif()

set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
Expand Down Expand Up @@ -40,7 +42,10 @@ else()
set(CTR_NATIVE_BUILD_ID "${CTR_NATIVE_GIT_HASH}-dirty-${CTR_NATIVE_BUILD_TIMESTAMP}")
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -Wno-error -g")
if(NOT ANDROID)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error -g")

function(ctr_native_add_label_warning_if_supported target warning flag_check)
set(saved_required_flags "${CMAKE_REQUIRED_FLAGS}")
Expand All @@ -57,21 +62,25 @@ function(ctr_native_add_label_warning_if_supported target warning flag_check)
endfunction()

# SDL3
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
set(SDL_STATIC ON CACHE BOOL "" FORCE)
set(SDL_SHARED ON CACHE BOOL "" FORCE)
set(SDL_STATIC OFF CACHE BOOL "" FORCE)
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
set(SDL_TESTS OFF CACHE BOOL "" FORCE)
set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SDL_INSTALL OFF CACHE BOOL "" FORCE)
set(SDL_GPU OFF CACHE BOOL "" FORCE)
set(SDL_RENDER OFF CACHE BOOL "" FORCE)
set(SDL_RENDER ON CACHE BOOL "" FORCE)
set(SDL_CAMERA OFF CACHE BOOL "" FORCE)
set(SDL_SENSOR OFF CACHE BOOL "" FORCE)
set(SDL_SENSOR ON CACHE BOOL "" FORCE)
set(SDL_DIALOG OFF CACHE BOOL "" FORCE)
set(SDL_TRAY OFF CACHE BOOL "" FORCE)
set(SDL_POWER OFF CACHE BOOL "" FORCE)
set(SDL_POWER ON CACHE BOOL "" FORCE)
set(SDL_VULKAN OFF CACHE BOOL "" FORCE)
set(SDL_OPENGLES OFF CACHE BOOL "" FORCE)
if(ANDROID)
set(SDL_OPENGLES ON CACHE BOOL "" FORCE)
else()
set(SDL_OPENGLES OFF CACHE BOOL "" FORCE)
endif()
set(SDL_OFFSCREEN OFF CACHE BOOL "" FORCE)
set(SDL_SNDIO OFF CACHE BOOL "" FORCE)
set(SDL_SNDIO_SHARED OFF CACHE BOOL "" FORCE)
Expand All @@ -80,7 +89,12 @@ set(SDL_X11_XTEST OFF CACHE BOOL "" FORCE)
add_subdirectory(externals/SDL)

# CTR Native
add_executable(ctr_native main.c)
if(ANDROID)
add_library(ctr_native SHARED main.c)
else()
add_executable(ctr_native main.c)
endif()
set_target_properties(ctr_native PROPERTIES LINKER_LANGUAGE CXX)
target_include_directories(ctr_native PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_compile_definitions(ctr_native PRIVATE
CTR_NATIVE
Expand All @@ -100,6 +114,9 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
ctr_native_add_label_warning_if_supported(ctr_native -Wc23-extensions CTR_HAS_WC23_EXTENSIONS)
endif()
target_link_libraries(ctr_native SDL3::SDL3)
if(ANDROID)
target_link_libraries(ctr_native log GLESv2 android)
endif()
target_link_options(ctr_native PRIVATE -static-libgcc)
if(WIN32)
target_link_options(ctr_native PRIVATE -static)
Expand Down
32 changes: 32 additions & 0 deletions README_ANDROID.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# CTR Native Android Port

This project has been ported to Android using SDL3.

## Building

1. Open the `android` folder in Android Studio.
2. Sync Gradle.
3. Build and run.

The build targets `armeabi-v7a` to maintain 32-bit compatibility with the game's memory model.

## Assets Setup (S21+ / Modern Android)

Due to Android security restrictions, the game looks for assets in its private external storage.

1. Install the app on your phone.
2. Create the following directory on your phone:
`/storage/emulated/0/Android/data/com.ctrnative/files/assets/`
3. Place your `ctr-u.bin` (NTSC-U retail disc image) into that `assets` folder.
The path should be:
`.../Android/data/com.ctrnative/files/assets/ctr-u.bin`
4. Alternatively, you can place extracted assets (BIGFILE.BIG, etc.) in the same `assets` folder.

## Controls

- The port supports the **Backbone One** and other standard Android gamepads via SDL3's Gamepad API.
- Touch controls are currently not implemented (keyboard/gamepad only).

## Troubleshooting

Check Logcat with tag `CTR-Native` for any initialization errors.
Binary file added android/.DS_Store
Binary file not shown.
Binary file added android/app/.DS_Store
Binary file not shown.
52 changes: 52 additions & 0 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
apply plugin: 'com.android.application'

android {
namespace 'com.ctrnative'
compileSdk 34

defaultConfig {
applicationId "com.ctrnative"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"

externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_static", "-DCTR_NATIVE=ON"
abiFilters 'armeabi-v7a'
}
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

externalNativeBuild {
cmake {
path "../../CMakeLists.txt"
version "3.22.1"
}
}

sourceSets {
main {
java.srcDirs = [
'src/main/java',
'../../externals/SDL/android-project/app/src/main/java'
]
res.srcDirs = [
'src/main/res',
'../../externals/SDL/android-project/app/src/main/res'
]
}
}
}

dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
}
26 changes: 26 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="CTR Native"
android:theme="@style/Theme.AppCompat.NoActionBar">

<activity
android:name=".CTRNativeActivity"
android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
android:label="CTR Native"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
13 changes: 13 additions & 0 deletions android/app/src/main/java/com/ctrnative/CTRNativeActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ctrnative;

import org.libsdl.app.SDLActivity;

public class CTRNativeActivity extends SDLActivity {
@Override
protected String[] getLibraries() {
return new String[] {
"SDL3",
"ctr_native"
};
}
}
20 changes: 20 additions & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.2'
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}
2 changes: 2 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
android.useAndroidX=true
android.enableJetifier=true
Binary file added android/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading