UPDATE何かを指定しました:?私はこの答えを掲載するので?を私はより洗練された解決策を見つけました。Android.mk
ファイル内の何かを変更する必要はありません。app/build.gradle
の関連部分です(元のgradleスクリプトはsyncopoli projectに属しています。このbuild.gradle
スクリプトhere:
android {
defaultConfig {
// ...
externalNativeBuild {
ndkBuild {
// I only want the following targets to be built
targets 'rsync', 'ssh'
}
}
ndk {
// add whatever ABIs you want here
abiFilters 'armeabi'
}
}
externalNativeBuild {
ndkBuild {
// all my external sources are under src/main/jni
path 'src/main/jni/Android.mk'
}
}
}
// this is the meat. It copies the binaries to appropriate location
// after externalNativeBuildRelease task is finished.
// you can change the paths to match where your binaries live and where
// you want them to go
gradle.taskGraph.afterTask { task ->
if (task.name == "externalNativeBuildRelease") {
def src = rootProject.file('app/build/intermediates/ndkBuild/release/obj/local/')
def dst = rootProject.file('app/src/main/assets/')
copy {
from(src) {
// the objs directory has all the .o files I don't care about
exclude "**/objs"
}
into dst
// this is purely for debugging purposes. it might come in handy
eachFile {
println "file = " + it.getPath()
}
}
}
}
私src/main/jni/Android.mk
あり、以下の内容:
include $(call all-subdir-makefiles)
前の回答
私はこの問題をヒットし、手動ndk-build
や設定を呼び出すのGradleで余分なタスクを作成することによって、その周りに働いていますこれらのタスクに依存するプロジェクト。
これはapp/build.gradle
の関連する部分である:
import org.apache.tools.ant.taskdefs.condition.Os
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
task ndkBuild(type: Exec) {
def ndkDirProperty = properties.getProperty('ndk.dir')
def ndkDirPrefix = ndkDirProperty != null ? ndkDirProperty + '/' : ''
def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
commandLine "${ndkDirPrefix}ndk-build${ndkBuildExt}", '-C', file('src/main').absolutePath,
'-j', Runtime.runtime.availableProcessors()
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
// Cleanup task to remove previously generated binaries
task ndkClean(type: Exec) {
def ndkDirProperty = properties.getProperty('ndk.dir')
def ndkDirPrefix = ndkDirProperty != null ? ndkDirProperty + '/' : ''
def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
commandLine "${ndkDirPrefix}ndk-build${ndkBuildExt}", '-C', file('src/main').absolutePath, 'clean'
}
tasks.withType(Delete) {
cleanTask -> cleanTask.dependsOn ndkClean
}
最終実行可能ファイルはassets/<target_arch_abi>/<executable
で終わるので、私はさらに実行可能ファイルのAndroid.mk
ファイルを変更しました。今
SAVED_NDK_APP_DST_DIR := $(NDK_APP_DST_DIR)
NDK_APP_DST_DIR := assets/$(TARGET_ARCH_ABI)
...LOCAL_MODULE/LOCAL_CFLAGS/LOCAL_etc...
include $(BUILD_EXECUTABLE)
NDK_APP_DST_DIR := $(SAVED_NDK_APP_DST_DIR)
、gradlew build
を実行すると、残りの部分と一緒に実行ファイルを作成します。
これが役に立ちます。