diff --git a/.github/workflows/ci_main.yml b/.github/workflows/ci_main.yml index 7391c2c..8231485 100644 --- a/.github/workflows/ci_main.yml +++ b/.github/workflows/ci_main.yml @@ -259,7 +259,11 @@ jobs: merge-multiple: true - name: List all artifacts - run: find artifacts -type f -ls | sort + run: find artifacts -type f -ls + + - name: Remove unwanted artifacts + run: | + rm -rf artifacts/libsimplejavable* - name: Upload artifacts to release uses: svenstaro/upload-release-action@v2 diff --git a/simpleble/CMakeLists.txt b/simpleble/CMakeLists.txt index e07055b..179cb6b 100644 --- a/simpleble/CMakeLists.txt +++ b/simpleble/CMakeLists.txt @@ -269,7 +269,35 @@ elseif(SIMPLEBLE_BACKEND_MACOS) elseif(SIMPLEBLE_BACKEND_ANDROID) message(STATUS "Configuring for Android") - include_directories(${ANDROID_NDK}/sysroot/usr/include) + # NOTE, these are the options sent by gradle when calling externalNativeBuild, cmake + # -DCMAKE_SYSTEM_NAME=Android \ + # -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + # -DCMAKE_SYSTEM_VERSION=31 \ + # -DANDROID_PLATFORM=android-31 \ + # -DANDROID_ABI=armeabi-v7a \ + # -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ + # -DANDROID_NDK=/Users/kdewald/Library/Android/sdk/ndk/27.0.12077973 \ + # -DCMAKE_ANDROID_NDK=/Users/kdewald/Library/Android/sdk/ndk/27.0.12077973 \ + # -DCMAKE_TOOLCHAIN_FILE=/Users/kdewald/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ + # -DCMAKE_MAKE_PROGRAM=/Users/kdewald/Library/Android/sdk/cmake/3.22.1/bin/ninja \ + # -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/kdewald/Workspaces/Personal/SimpleBLE/simpledroidble/simpledroidble/build/intermediates/cxx/Debug/2m126g5n/obj/armeabi-v7a \ + # -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/kdewald/Workspaces/Personal/SimpleBLE/simpledroidble/simpledroidble/build/intermediates/cxx/Debug/2m126g5n/obj/armeabi-v7a \ + # -DCMAKE_BUILD_TYPE=Debug \ + # -B/Users/kdewald/Workspaces/Personal/SimpleBLE/simpledroidble/simpledroidble/.cxx/Debug/2m126g5n/armeabi-v7a \ + # -GNinja + + message(STATUS "ANDROID_NDK: ${ANDROID_NDK}") + message(STATUS "ANDROID_NATIVE_API_LEVEL: ${ANDROID_NATIVE_API_LEVEL}") + message(STATUS "ANDROID_ABI: ${ANDROID_ABI}") + message(STATUS "ANDROID_PLATFORM: ${ANDROID_PLATFORM}") + message(STATUS "CMAKE_ANDROID_NDK: ${CMAKE_ANDROID_NDK}") + message(STATUS "ANDROID_SDK_ROOT: ${ANDROID_SDK_ROOT}") + message(STATUS "CMAKE_ANDROID_API: ${CMAKE_ANDROID_API}") + + # Throw an error to stop the build + message(FATAL_ERROR "Build stopped intentionally. Please check your Android configuration.") + + # include_directories(${ANDROID_NDK}/sysroot/usr/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/backends/android) add_compile_options(-DANDROID -D__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL}) @@ -298,6 +326,76 @@ elseif(SIMPLEBLE_BACKEND_ANDROID) ${CMAKE_CURRENT_SOURCE_DIR}/src/backends/android/jni/List.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/backends/android/jni/Set.cpp) target_link_libraries(simpleble PUBLIC android nativehelper log) + + # Build the simpleble-bridge library + + # include(UseJava) + # find_package(Java COMPONENTS Development REQUIRED) + + # set(ANDROID_SDK_ROOT ${CMAKE_ANDROID_NDK}/../../) + # message(STATUS "ANDROID_SDK_ROOT: ${ANDROID_SDK_ROOT}") + # set(ANDROID_JAR ${ANDROID_SDK_ROOT}/platforms/android-${CMAKE_ANDROID_API}/android.jar) + # message(STATUS "ANDROID_JAR: ${ANDROID_JAR}") + + # set(JAVA_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/backends/android/simpleble-bridge/src/main") + # set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/aar_output") + # set(AAR_NAME "simpleble-bridge.aar") + + # set(JAVA_FILES + # "${JAVA_SRC_DIR}/java/org/simpleble/android/bridge/BluetoothGattCallback.java" + # "${JAVA_SRC_DIR}/java/org/simpleble/android/bridge/ScanCallback.java" + # ) + + # # Create classes.jar using add_jar + # add_jar( + # simpleble_classes + # SOURCES ${JAVA_FILES} + # OUTPUT_DIR ${OUTPUT_DIR} + # INCLUDE_JARS ${ANDROID_JAR} + # ) + + # # Copy AndroidManifest.xml + # add_custom_command( + # OUTPUT ${OUTPUT_DIR}/AndroidManifest.xml + # COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} + # COMMAND ${CMAKE_COMMAND} -E copy + # ${JAVA_SRC_DIR}/AndroidManifest.xml + # ${OUTPUT_DIR}/AndroidManifest.xml + # DEPENDS ${JAVA_SRC_DIR}/AndroidManifest.xml + # COMMENT "Copying AndroidManifest.xml" + # ) + + # # Create empty R.txt (no resources) + # add_custom_command( + # OUTPUT ${OUTPUT_DIR}/R.txt + # COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT_DIR}/R.txt + # COMMENT "Creating empty R.txt" + # ) + + # # Package AAR + # add_custom_command( + # OUTPUT ${OUTPUT_DIR}/${AAR_NAME} + # COMMAND ${CMAKE_COMMAND} -E remove -f ${OUTPUT_DIR}/${AAR_NAME} + # COMMAND ${CMAKE_COMMAND} -E chdir ${OUTPUT_DIR} + # zip -j ${AAR_NAME} + # AndroidManifest.xml + # simpleble_classes.jar + # R.txt + # DEPENDS + # simpleble_classes + # ${OUTPUT_DIR}/AndroidManifest.xml + # ${OUTPUT_DIR}/R.txt + # COMMENT "Packaging ${AAR_NAME}" + # ) + + # # Define custom target + # add_custom_target( + # build_aar ALL + # DEPENDS ${OUTPUT_DIR}/${AAR_NAME} + # COMMENT "Building ${AAR_NAME}" + # ) + + endif() apply_build_options(simpleble diff --git a/simpleble/src/backends/android/simpleble-bridge/.idea/gradle.xml b/simpleble/src/backends/android/simpleble-bridge/.idea/gradle.xml index 4019936..1dfa0c8 100644 --- a/simpleble/src/backends/android/simpleble-bridge/.idea/gradle.xml +++ b/simpleble/src/backends/android/simpleble-bridge/.idea/gradle.xml @@ -4,8 +4,14 @@ diff --git a/simpleble/src/backends/android/simpleble-bridge/.idea/misc.xml b/simpleble/src/backends/android/simpleble-bridge/.idea/misc.xml index 3040d03..8bb1dd1 100644 --- a/simpleble/src/backends/android/simpleble-bridge/.idea/misc.xml +++ b/simpleble/src/backends/android/simpleble-bridge/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/simpleble/src/backends/android/simpleble-bridge/.idea/runConfigurations.xml b/simpleble/src/backends/android/simpleble-bridge/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/simpleble/src/backends/android/simpleble-bridge/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/simpledroidble/simpledroidble/build.gradle.kts b/simpledroidble/simpledroidble/build.gradle.kts index 2407e06..7905855 100644 --- a/simpledroidble/simpledroidble/build.gradle.kts +++ b/simpledroidble/simpledroidble/build.gradle.kts @@ -3,6 +3,65 @@ plugins { alias(libs.plugins.jetbrainsKotlinAndroid) } +val androidExtension = project.extensions.getByType() +val androidSdkDir = androidExtension.sdkDirectory.absolutePath +val androidNdkDir = androidExtension.ndkDirectory.absolutePath +val cmakePath = androidExtension.cmake.get().path +val cmakeVersion = androidExtension.cmake.get().version + +val simpleDroidBleCompileSdkVersion = 35 +val simpleDroidBleMinSdkVersion = 31 + + +// Define the path to the root simpleble CMake project +val simplebleRootPath = rootProject.projectDir.resolve("../simpleble").canonicalPath +// Define where the custom CMake task will build the AAR +val simplebleBuildPath = layout.buildDirectory.dir("build_simpleble_root").get().asFile +// Define the expected output path of the AAR from the custom build +val simplebleAarPath = layout.buildDirectory.dir("build_simpleble_root/aar_output/simpleble-bridge.aar").get().asFile.absolutePath + + +// Task to build the simpleble-bridge.aar using the root CMakeLists.txt +tasks.register("buildSimpleBleAar") { + description = "Builds simpleble-bridge.aar from the root simpleble project" + group = "build" + + // // Define inputs and outputs for Gradle's up-to-date checking + // inputs.dir(simplebleRootPath) + // // Declare dependency on NDK and SDK directories for up-to-date checks + // inputs.dir(sdkDir) + // inputs.dir(ndkDir) + outputs.file(simplebleAarPath) + + // CMake Configuration Step + commandLine( + "cmake", + "-S", simplebleRootPath, // Source directory + "-B", simplebleBuildPath, + "-DCMAKE_SYSTEM_NAME=Android", + "-DCMAKE_ANDROID_NDK=$androidNdkDir", + "-DCMAKE_SYSTEM_VERSION=$simpleDroidBleMinSdkVersion", + ) + + // CMake Build Step (runs after configuration) + doLast { + exec { + workingDir(simplebleRootPath) + commandLine( + "cmake", + "--build", simplebleBuildPath.absolutePath, + "--target", "build_aar", // Build the specific AAR target + "--config", "Release" // Or Debug + ) + } + } +} + +// Make the standard build process depend on our custom AAR build task +tasks.named("preBuild") { + dependsOn("buildSimpleBleAar") +} + android { namespace = "org.simpleble.android" compileSdk = 35 @@ -49,4 +108,10 @@ dependencies { //noinspection UseTomlInstead implementation("org.simpleble.android.bridge:simpleble-bridge") + + // // Depend on the AAR file produced by the custom buildSimpleBleAar task + // implementation(files(simplebleAarPath)) { + // // Ensure the dependency resolution waits for the task to complete + // builtBy("buildSimpleBleAar") + // } } \ No newline at end of file diff --git a/simpledroidble/simpledroidble/src/main/cpp/CMakeLists.txt b/simpledroidble/simpledroidble/src/main/cpp/CMakeLists.txt index c5ee0fd..dcccf8f 100644 --- a/simpledroidble/simpledroidble/src/main/cpp/CMakeLists.txt +++ b/simpledroidble/simpledroidble/src/main/cpp/CMakeLists.txt @@ -31,6 +31,9 @@ add_library( android_utils.cpp ) +# Explicitly state that the JNI library depends on the AAR being built +# add_dependencies(${CMAKE_PROJECT_NAME} build_aar) + set_target_properties( ${CMAKE_PROJECT_NAME} PROPERTIES CXX_STANDARD 17 diff --git a/utils/build_android.sh b/utils/build_android.sh index f2f07c6..45de251 100755 --- a/utils/build_android.sh +++ b/utils/build_android.sh @@ -60,7 +60,7 @@ eval set -- "$PARAMS" PROJECT_ROOT=$(realpath $(dirname `realpath $0`)/..) SOURCE_PATH=$PROJECT_ROOT/simpleble BUILD_PATH=$PROJECT_ROOT/build_simpleble_android -INSTALL_PATH=$BUILD_PATH/install +INSTALL_PATH=$PROJECT_ROOT/install_simpleble_android EXAMPLE_BUILD_PATH=$PROJECT_ROOT/build_simpleble_android_examples EXAMPLE_SOURCE_PATH=$PROJECT_ROOT/examples/simpleble @@ -68,6 +68,7 @@ EXAMPLE_SOURCE_PATH=$PROJECT_ROOT/examples/simpleble # If FLAG_CLEAN is set, clean the build directory if [[ ! -z "$FLAG_CLEAN" ]]; then rm -rf $BUILD_PATH + rm -rf $INSTALL_PATH rm -rf $EXAMPLE_BUILD_PATH fi @@ -78,27 +79,28 @@ if [ -z "$ANDROID_NDK_HOME" ]; then fi # These are some hardcoded variables used for my test process. You can change them to fit your needs. -ANDROID_ARCH_ABI="armeabi-v7a" -ANDROID_API=21 +ANDROID_ARCH_ABI="arm64-v8a" +ANDROID_API=31 # NOTE: Also look at ANDROID_STL_TYPE -ANDROID_ARGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$ANDROID_NDK_HOME -DCMAKE_ANDROID_ARCH_ABI=$ANDROID_ARCH_ABI -DCMAKE_ANDROID_API=$ANDROID_API" +# -DCMAKE_SYSTEM_VERSION=31 +ANDROID_ARGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$ANDROID_NDK_HOME -DCMAKE_ANDROID_ARCH_ABI=$ANDROID_ARCH_ABI -DCMAKE_ANDROID_API=$ANDROID_API -DSIMPLEBLE_EXCLUDE_C=ON" cmake -H$SOURCE_PATH -B $BUILD_PATH $ANDROID_ARGS cmake --build $BUILD_PATH -j7 cmake --install $BUILD_PATH --prefix "${INSTALL_PATH}" -if [[ ! -z "$FLAG_EXAMPLE" ]]; then - cmake -H$EXAMPLE_SOURCE_PATH -B $EXAMPLE_BUILD_PATH $ANDROID_ARGS - cmake --build $EXAMPLE_BUILD_PATH -j7 +# if [[ ! -z "$FLAG_EXAMPLE" ]]; then +# cmake -H$EXAMPLE_SOURCE_PATH -B $EXAMPLE_BUILD_PATH $ANDROID_ARGS +# cmake --build $EXAMPLE_BUILD_PATH -j7 - if [[ ! -z "$FLAG_DEPLOY" ]]; then - adb shell rm -rf /data/local/tmp/simpleble - adb shell mkdir /data/local/tmp/simpleble - adb push $EXAMPLE_BUILD_PATH/bin/* /data/local/tmp/simpleble - adb shell chmod +x /data/local/tmp/simpleble/* - fi +# if [[ ! -z "$FLAG_DEPLOY" ]]; then +# adb shell rm -rf /data/local/tmp/simpleble +# adb shell mkdir /data/local/tmp/simpleble +# adb push $EXAMPLE_BUILD_PATH/bin/* /data/local/tmp/simpleble +# adb shell chmod +x /data/local/tmp/simpleble/* +# fi - if [[ ! -z "$FLAG_RUN" ]]; then - adb shell /data/local/tmp/simpleble/$FLAG_RUN - fi -fi \ No newline at end of file +# if [[ ! -z "$FLAG_RUN" ]]; then +# adb shell /data/local/tmp/simpleble/$FLAG_RUN +# fi +# fi \ No newline at end of file