Skip to content

Latest commit

 

History

History
121 lines (99 loc) · 3.09 KB

android_setup.md

File metadata and controls

121 lines (99 loc) · 3.09 KB

Android Build Setup

These instructions require the Android Gradle Build Plugin 4.0.0 or newer as it relies on the new prefab integration. Check below for a pre-4.0.0 workaround.

repositories {
  maven {
    mavenCentral()
  }
}

android {
  dependencies {
    implementation 'com.facebook.fbjni:fbjni:0.2.2'
  }
}

Now, in your CMake setup, you can refer to the fbjni package. The header files (e.g. fbjni.h) will available implicitly.

set(build_DIR ${CMAKE_SOURCE_DIR}/build)
set(PACKAGE_NAME "myapp")

find_package(fbjni REQUIRED CONFIG)

target_link_libraries(${PACKAGE_NAME} fbjni::fbjni mylibrary)

Android Build Setup (pre-4.0.0)

The Android Gradle plugin does not provide built-in support for artifacts that include native libraries (for linking against) and header files. Because of that, some manual additions to your build system are required. The following is an example of what this can look like but by no means prescriptive.

In your app-specific build.gradle:

repositories {
  maven {
    jcenter()
  }
}

android {
  // Create new configurations that can be referred to in dependencies.
  // The Android Gradle Plugin 3.* does not allow hooking into existing
  // configurations like `implementation`.
  configurations {
    extractHeaders
    extractJNI
  }

  dependencies {
    implementation 'com.facebook.fbjni:fbjni:0.0.1'
    // If headers are required.
    extractHeaders 'com.facebook.fbjni:fbjni:0.0.1:headers'
    // If the `.so` files are required for linking.
    extractJNI 'com.facebook.fbjni:fbjni:0.0.1'
  }
}

task extractAARHeaders {
    doLast {
        configurations.extractHeaders.files.each {
            def file = it.absoluteFile
            copy {
                from zipTree(file)
                into "$buildDir/$file.name"
                include "**/*.h"
            }
        }
    }
}

task extractJNIFiles {
    doLast {
        configurations.extractJNI.files.each {
            def file = it.absoluteFile
            copy {
                from zipTree(file)
                into "$buildDir/$file.name"
                include "jni/**/*"
            }
        }
    }
}

tasks.whenTaskAdded { task ->
    if (task.name.contains('externalNativeBuild')) {
        task.dependsOn(extractAARHeaders)
        task.dependsOn(extractJNIFiles)
    }
}

With this setup in place, prior to any native build jobs, the header files and JNI shared libraries will be extracted under the build directory.

Now, in your CMake setup, you can refer to the extracted paths:

set(build_DIR ${CMAKE_SOURCE_DIR}/build)
set(PACKAGE_NAME "myapp")

file(GLOB libfbjni_link_DIRS "${build_DIR}/fbjni*.aar/jni/${ANDROID_ABI}")
file(GLOB libfbjni_include_DIRS "${build_DIR}/fbjni-*-headers.jar/")

find_library(FBJNI_LIBRARY fbjni PATHS ${libfbjni_link_DIRS}
NO_CMAKE_FIND_ROOT_PATH)

target_include_directories(${PACKAGE_NAME} PRIVATE
  // Additional header directories here
  ${libfbjni_include_DIRS}
)
target_link_libraries(${PACKAGE_NAME} ${FBJNI_LIBRARY} mylibrary)