Skip to content
Merged
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
36 changes: 19 additions & 17 deletions .github/workflows/build-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,6 @@ jobs:
ruby-version: '3.0'
working-directory: mobile-app/ios

- name: Install CocoaPods dependencies
working-directory: mobile-app/ios
run: |
rm -rf Pods || true
pod install --repo-update || pod install

- name: Select Xcode 16.4
run: sudo xcode-select -s "/Applications/Xcode_16.4.app/Contents/Developer"

Expand All @@ -83,22 +77,29 @@ jobs:
rm -rf /tmp/metro-* || true
rm -rf ios/build || true

- name: Generate ReactCodegen files
- name: Generate codegen artifacts
working-directory: mobile-app
env:
RCT_NEW_ARCH_ENABLED: '1'
run: |
# Generate codegen artifacts for all modules including custom nim-bridge
node node_modules/react-native/scripts/generate-codegen-artifacts.js \
--path . \
--targetPlatform ios \
--outputPath ios/build/generated/ios

- name: Install CocoaPods dependencies
working-directory: mobile-app/ios
env:
RCT_NEW_ARCH_ENABLED: '1'
run: |
# Generate ReactCodegen files (this will fail but creates the required files)
xcodebuild -workspace nimrnmobileapp.xcworkspace \
-scheme ReactCodegen \
-sdk iphonesimulator \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 16' \
-derivedDataPath build \
CODE_SIGNING_ALLOWED=NO \
ARCHS=arm64 \
ONLY_ACTIVE_ARCH=YES || echo "ReactCodegen files generated (expected failure)"
rm -rf Pods || true
pod install --repo-update || pod install

- name: Build iOS Simulator App
working-directory: mobile-app/ios
env:
RCT_NEW_ARCH_ENABLED: '1'
run: |
set -o pipefail
xcodebuild -workspace nimrnmobileapp.xcworkspace \
Expand All @@ -110,6 +111,7 @@ jobs:
CODE_SIGNING_ALLOWED=NO \
ARCHS=arm64 \
ONLY_ACTIVE_ARCH=YES \
RCT_NEW_ARCH_ENABLED=1 \
| xcbeautify

- name: Prepare iOS app for upload
Expand Down
28 changes: 23 additions & 5 deletions mobile-app/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -291,12 +291,33 @@ PODS:
- hermes-engine/Pre-built (= 0.81.4)
- hermes-engine/Pre-built (0.81.4)
- NimBridge (1.0.0):
- boost
- DoubleConversion
- fast_float
- fmt
- glog
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- RCTRequired
- RCTTypeSafety
- React-Codegen
- React-Core
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- RCT-Folly (2024.11.18.00):
- boost
- DoubleConversion
Expand Down Expand Up @@ -336,7 +357,6 @@ PODS:
- React-RCTText (= 0.81.4)
- React-RCTVibration (= 0.81.4)
- React-callinvoker (0.81.4)
- React-Codegen (0.1.0)
- React-Core (0.81.4):
- boost
- DoubleConversion
Expand Down Expand Up @@ -2638,7 +2658,6 @@ DEPENDENCIES:

SPEC REPOS:
trunk:
- React-Codegen
- SocketRocket

EXTERNAL SOURCES:
Expand Down Expand Up @@ -2838,14 +2857,13 @@ SPEC CHECKSUMS:
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394
NimBridge: e3bf2fde48f7e6c5859d637c84b9e1c0d45cd781
NimBridge: d3882c7c781b494b6f9c21b89869919a302215ef
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
RCTDeprecation: c0ed3249a97243002615517dff789bf4666cf585
RCTRequired: 58719f5124f9267b5f9649c08bf23d9aea845b23
RCTTypeSafety: 4aefa8328ab1f86da273f08517f1f6b343f6c2cc
React: 2073376f47c71b7e9a0af7535986a77522ce1049
React-callinvoker: 751b6f2c83347a0486391c3f266f291f0f53b27e
React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a
React-Core: dff5d29973349b11dd6631c9498456d75f846d5e
React-CoreModules: c0ae04452e4c5d30e06f8e94692a49107657f537
React-cxxreact: 376fd672c95dfb64ad5cc246e6a1e9edb78dec4c
Expand Down
20 changes: 2 additions & 18 deletions mobile-app/modules/nim-bridge/NimBridge.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
require "json"

package = JSON.parse(File.read(File.join(__dir__, "package.json")))
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'

Pod::Spec.new do |s|
s.name = "NimBridge"
Expand All @@ -26,21 +25,6 @@ Pod::Spec.new do |s|
'OTHER_LDFLAGS' => '-pthread'
}

# React Native dependencies
s.dependency "React-Core"

# Don't install the dependencies when we run `pod install` in the old architecture.
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
s.pod_target_xcconfig = {
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
"OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
}
s.dependency "React-Codegen"
s.dependency "RCT-Folly"
s.dependency "RCTRequired"
s.dependency "RCTTypeSafety"
s.dependency "ReactCommon/turbomodule/core"
end
# This one line handles all new architecture dependencies automatically
install_modules_dependencies(s)
end
16 changes: 15 additions & 1 deletion mobile-app/modules/nim-bridge/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,20 @@ buildscript {

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'com.facebook.react'

def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
// Only use 64-bit architectures for Nim compatibility
return value ? value.split(",") : ["x86_64", "arm64-v8a"]
}

react {
root = file("../../")
reactNativeDir = file("../../../node_modules/react-native")
codegenDir = file("../../../node_modules/@react-native/codegen")
}

android {
compileSdkVersion 34
buildToolsVersion "34.0.0"
Expand All @@ -44,6 +51,13 @@ android {
}
}

// Ensure CMake runs after codegen
tasks.configureEach { task ->
if (task.name.contains('configureCMake')) {
task.dependsOn(preBuild)
}
}

buildTypes {
release {
minifyEnabled false
Expand All @@ -68,4 +82,4 @@ repositories {

dependencies {
implementation 'com.facebook.react:react-native:+'
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@
package com.nimbridge

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.module.annotations.ReactModule
import com.nimbridge.NativeNimBridgeSpec

@ReactModule(name = NimBridgeModule.NAME)
class NimBridgeModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
class NimBridgeModule(reactContext: ReactApplicationContext) : NativeNimBridgeSpec(reactContext) {

companion object {
const val NAME = "NimBridge"

init {
try {
System.loadLibrary("nim_functions")
Expand All @@ -24,7 +23,7 @@ class NimBridgeModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
e.printStackTrace()
}
}

@JvmStatic
private external fun nativeHelloWorld(): String
@JvmStatic
Expand All @@ -47,72 +46,72 @@ class NimBridgeModule(reactContext: ReactApplicationContext) : ReactContextBaseJ

override fun getName(): String = NAME

@ReactMethod(isBlockingSynchronousMethod = true)
fun helloWorld(): String {

override fun helloWorld(): String {
return try {
nativeHelloWorld()
} catch (e: Exception) {
"Error: ${e.message}"
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun addNumbers(a: Double, b: Double): Double {

override fun addNumbers(a: Double, b: Double): Double {
return try {
nativeAddNumbers(a.toInt(), b.toInt()).toDouble()
} catch (e: Exception) {
0.0
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun getSystemInfo(): String {

override fun getSystemInfo(): String {
return try {
nativeGetSystemInfo()
} catch (e: Exception) {
"Error: ${e.message}"
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun mobileFibonacci(n: Double): Double {

override fun fibonacci(n: Double): Double {
return try {
nativeMobileFibonacci(n.toInt()).toDouble()
} catch (e: Exception) {
0.0
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun mobileIsPrime(n: Double): Double {

override fun isPrime(n: Double): Boolean {
return try {
nativeMobileIsPrime(n.toInt()).toDouble()
nativeMobileIsPrime(n.toInt()) != 0
} catch (e: Exception) {
0.0
false
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun mobileFactorize(n: Double): String {

override fun factorize(n: Double): String {
return try {
nativeMobileFactorize(n.toInt())
} catch (e: Exception) {
"Error: ${e.message}"
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun mobileCreateUser(id: Double, name: String, email: String): String {

override fun createUser(id: Double, name: String, email: String): String {
return try {
nativeMobileCreateUser(id.toInt(), name, email)
} catch (e: Exception) {
"Error: ${e.message}"
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun mobileValidateEmail(email: String): Double {

override fun validateEmail(email: String): Boolean {
return try {
nativeMobileValidateEmail(email).toDouble()
nativeMobileValidateEmail(email) != 0
} catch (e: Exception) {
0.0
false
}
}
@ReactMethod(isBlockingSynchronousMethod = true)
fun getNimCoreVersion(): String {

override fun getVersion(): String {
return try {
nativeGetNimCoreVersion()
} catch (e: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,35 @@

package com.nimbridge

import com.facebook.react.ReactPackage
import com.facebook.react.TurboReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
import com.facebook.react.module.model.ReactModuleInfo
import com.facebook.react.module.model.ReactModuleInfoProvider
import com.facebook.react.turbomodule.core.interfaces.TurboModule

class NimBridgePackage : ReactPackage {

override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf(NimBridgeModule(reactContext))
class NimBridgePackage : TurboReactPackage() {

override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
return if (name == NimBridgeModule.NAME) {
NimBridgeModule(reactContext)
} else {
null
}
}

override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()

override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
return ReactModuleInfoProvider {
mapOf(
NimBridgeModule.NAME to ReactModuleInfo(
NimBridgeModule.NAME,
NimBridgeModule::class.java.name,
false, // canOverrideExistingModule
false, // needsEagerInit
true, // isCxxModule
true // isTurboModule
)
)
}
}
}
Loading
Loading