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)
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)