Gradle unable to find android_native_app_glue - android

I have a native library which I am trying to build with gradle. If I invoke the ndk-build command from the gradle file, I am able to build the native library. But if I try to use the ndk build functionality built in the android gradle plugin I an unable to build.
I get fatal error: android_native_app_glue.h: No such file or directory
The relevant section of the gradle file is:
buildTypes.debug.jniDebugBuild true
defaultConfig {
ndk {
moduleName 'myModule'
stl 'gnustl_static'
cFlags '-UNDEBUG -Werror -Wunused-variable -Wunused-but-set-parameter -Wtype-limits -Wmissing-field-initializers -Wreturn-type -Wuninitialized'
ldLibs 'log', 'GLESv2'
}
productFlavors {
armv7{
ndk {
abiFilter 'armeabi-v7a'
}
}
}
}
Is there a way to tell the ndk build where to find the android_native_app_glue.h file?
On a side note, is there a way to pass the verbose flag to ndk-build, the equivalent of ndk-build V=1 ?

I had the same issue and I fixed it by adding "-I{path_to_android-ndk}/sources/android/native_app_glue" to cFlags, see here

As of:
gradle-experimental:0.6.0-alpha2
gradle-2.9-all.zip
One way to do it (Or to integrate any code that can be compiled and link as a static library) is to create in your project a new module, and change the gradle file of that module to be:
apply plugin: 'com.android.model.library'
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
minSdkVersion.apiLevel = 21
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "0.0.1"
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
}
android.ndk {
moduleName = "native-activity"
cppFlags.add("-Werror")
ldLibs.addAll(["log", "android"])
stl = "gnustl_static"
ldFlags.add("-c")
}
android.sources {
main {
jni {
source {
srcDir "${ndkDir}/sources/android/native_app_glue"
}
}
}
}
}
Then in your module's gradle.mk you should just add:
apply plugin: 'com.android.model.application'
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
model {
android {
[...]
}
android.ndk {
[...]
cppFlags.add("-I${file("${ndkDir}/sources/android/native_app_glue")}".toString())
}
android.sources {
main {
jni {
dependencies {
project ":native-activity" linkage "static"
}
}
}
}
}
dependencies {
compile project(':native-activity')
}

One way to do this is to add it to your LOCAL_C_INCLUDES in Android.mk, like this:
LOCAL_C_INCLUDES += /path/to/ndk/sources/android/native_app_glue
Make sure the path is correct, by doing an ls on /path/to/ndk/sources/android/native_app_glue/native_app_glue.h

add these line in your cMakeList.txt file
//line1
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
//line2
add_library(native_app_glue STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
also add native_app_glue in target_link_libraries.
It come in effect only after click on RUN or shift + F10

Add to cmake
include(AndroidNdkModules)
android_ndk_import_module_native_app_glue()
target_link_libraries(
native_app_glue
)

Related

Migrate build to use cmake

I'm migrating a project from gradle-experimental:0.8.3 to gradle:2.3.3 .
Along with it I need to also start using the new cmake which is proving to not be so straight forward.
A snippet for the experimental gradle plugin that worked:
repositories {
libs(PrebuiltLibraries) {
// Configure one pre-built lib: shared
crypto {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/openssl/includes"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/openssl/lib/armeabi/libcrypto.so")
}
}
openssl {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/openssl/includes"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/openssl/lib/armeabi/libssl.so")
}
}
pjsip {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/pjsip/includes"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/pjsip/lib/armeabi/libpjsua.so")
}
}
}
}
android {
def globalConfiguration = rootProject.ext
compileSdkVersion = globalConfiguration.androidCompileSdkVersion
buildToolsVersion = globalConfiguration.androidBuildToolsVersion
defaultConfig.with {
minSdkVersion.apiLevel = globalConfiguration.androidMinSdkVersion
targetSdkVersion.apiLevel = globalConfiguration.androidTargetSdkVersion
multiDexEnabled = true
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}
dexOptions.with {
javaMaxHeapSize = "4g"
}
lintOptions.with {
abortOnError = false
}
sources {
main {
jni {
dependencies {
library 'crypto' linkage 'shared'
library 'openssl' linkage 'shared'
library 'pjsip' linkage 'shared'
}
}
jniLibs {
// for shared lib, lib need to be pushed to the target too
// Once libs are copied into app/src/main/jniLibs directory,
// Android Studio will pack them into APK's lib/ directory
// Here we like to avoid another duplication by pointing
// to the files that containing our libs' distribution location
// so the same file is used by compiler at host, also packed
// into APk to be used at Target (phone/tablet)
source {
srcDir "${lib_distribution_root}/openssl/lib/armeabi"
srcDir "${lib_distribution_root}/pjsip/lib/armeabi"
}
}
}
}
ndk {
moduleName = "datanative"
platformVersion = 19
stl = "gnustl_static"
ldLibs.addAll("android", "stdc++", "log", "GLESv2", "EGL", "OpenSLES", "z", "m")
cppFlags.addAll("-std=c++11", "-frtti", "-fexceptions", "-pthread", "-fpic", "-ffunction-sections", "-funwind-tables")
cppFlags.add("-DPJ_AUTOCONF")
abiFilters.add(abiName)
cppFlags.add("-marm")
}
}
}
The current work-in-progress has the gradle config:
android {
def globalConfiguration = rootProject.ext
compileSdkVersion globalConfiguration.androidCompileSdkVersion
buildToolsVersion globalConfiguration.androidBuildToolsVersion
defaultConfig {
minSdkVersion globalConfiguration.androidMinSdkVersion
targetSdkVersion globalConfiguration.androidTargetSdkVersion
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11", "-DPJ_AUTOCONF", "-fpic", "-frtti", "-fexceptions", "-pthread", "-ffunction-sections", "-funwind-tables", "-marm"
arguments '-DANDROID_PLATFORM=android-21', '-DANDROID_STL=gnustl_static'
}
}
ndk {
moduleName "datanative"
abiFilters 'armeabi'
}
}
externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}
sourceSets {
main {
jniLibs.srcDirs '../distribution/pjsip/lib/armeabi/', '../distribution/openssl/lib/armeabi/', 'src/main/cpp/'
}
}
dexOptions.with {
javaMaxHeapSize = "4g"
}
lintOptions.with {
abortOnError = false
}
}
And the CMakeLists:
cmake_minimum_required(VERSION 3.4.1)
file(GLOB SOURCES
src/main/cpp/*.h
src/main/cpp/*.cpp
)
set(distribution_DIR ${path})
include_directories(src/main/cpp/)
include_directories(../distribution/openssl/includes/)
include_directories(../distribution/pjsip/includes/)
add_library( crypto SHARED IMPORTED )
set_target_properties(crypto PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
absolute_path_cause_gradle_has_error_otherwise/distribution/openssl/lib/armeabi/libcrypto.so )
add_library( ssl SHARED IMPORTED )
set_target_properties(ssl PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
absolute_path_cause_gradle_has_error_otherwise/distribution/openssl/lib/armeabi/libssl.so )
add_library( pjsip SHARED IMPORTED )
set_target_properties(pjsip PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
absolute_path_cause_gradle_has_error_otherwise/distribution/pjsip/lib/armeabi/libpjsua.so )
add_library( data SHARED ${SOURCES} )
target_link_libraries(data crypto ssl pjsip)
The linking error that I'm facing and maybe not the root cause:
/src/main/cpp/sthread.cpp
Error:(73) undefined reference to '__emutls_v._ZN6STrace12pLocalStreamE'
Error:(73) undefined reference to '__emutls_v._ZN6STrace12pLocalStreamE'
/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/basic_string.h
Error:(547) undefined reference to '__emutls_v._ZN6STrace12pLocalStreamE'
Error:(547) undefined reference to '__emutls_v._ZN6STrace12pLocalStreamE'
Any clue will be apreciated.
Thank you!

build gradle fail with "no signature of method .... is applicable for argument types: (java.lang.String) values"

I have 4 gradle build files: when I build in android studio I am constantly having the error:
No signature of method:
org.gradle.model.ModelMap.getDefaultProguardFile() is applicable for
argument types: (java.lang.String) values: [proguard-android.txt]
file 1
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.9.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
file 2
apply plugin: 'com.android.model.native'
model {
android {
compileSdkVersion = 25
buildToolsVersion = '25.0.0'
defaultConfig {
minSdkVersion.apiLevel = 17
targetSdkVersion.apiLevel = 25
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'fpextractor'
platformVersion = 17
toolchain = "clang"
stl = 'gnustl_static' //std::mutex not in gnustl_static
cppFlags.add('-std=c++11')
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'x86'])
//abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64']) //this is default
//abiFilters.addAll(['armeabi'])
ldLibs.addAll(['android', 'log', 'atomic', 'z'])
}
}
}
// This is just copy out the header file and built lib into distribution
// directory for clint application to use; it is a small overhead of this sample:
// both lib and app are put inside one project space [save maintenance time]
task(distributeLib, type : Copy) {
// trigger build library
dependsOn assemble
into '../distribution/fpextractor/'
from('src/main/jni/fp_extractor.h') {
into 'include/'
}
from('build/outputs/native/release/lib') {
into 'lib/'
}
}
file 3
apply plugin: 'com.android.model.native'
model {
android {
compileSdkVersion = 25
buildToolsVersion = '25.0.0'
defaultConfig {
minSdkVersion.apiLevel = 17
targetSdkVersion.apiLevel = 25
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'nativeaudio'
platformVersion = 17
toolchain = "clang"
stl = 'gnustl_static' //std::mutex not in gnustl_static
cppFlags.add('-std=c++11')
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'x86'])
//abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64']) //this is default
//abiFilters.addAll(['armeabi-v7a'])
ldLibs.addAll(['android', 'log', 'OpenSLES', 'atomic'])
}
}
}
// This is just copy out the header file and built lib into distribution
// directory for clint application to use; it is a small overhead of this sample:
// both lib and app are put inside one project space [save maintenance time]
task(distributeLib, type : Copy) {
// trigger build library
dependsOn assemble
into '../distribution/nativeaudio/'
from('src/main/jni/buf_manager.h') {
into 'include/'
}
from('src/main/jni/android_debug.h') {
into 'include/'
}
from('src/main/jni/debug_utils.h') {
into 'include/'
}
from('src/main/jni/audio_common.h') {
into 'include/'
}
from('src/main/jni/audio_recorder.h') {
into 'include/'
}
from('build/outputs/native/release/lib') {
into 'lib/'
}
}
file 4
apply plugin: 'com.android.model.application'
// Root of 3rd party lib(s): location could be anywhere on the host system
def lib_distribution_root = '../distribution'
model {
repositories {
libs(PrebuiltLibraries) {
// Configure one pre-built lib: shared
nativeaudio {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/nativeaudio/include"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/nativeaudio/lib/${targetPlatform.getName()}/libnativeaudio.so")
}
}
fpextractor {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/fpextractor/include"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/fpextractor/lib/${targetPlatform.getName()}/libfpextractor.so")
}
}
// Configure another pre-built lib: shared;[change to static after Studio supports]
// static lib generation. USING static lib is supported NOW, for that case,
// simple change:
// SharedLibaryBinary --> StaticLibraryBinary
// sharedLibraryFile --> staticLibraryFile
// *.so --> *.a
//gperf {
// headers.srcDir "${lib_distribution_root}/gperf/include"
// binaries.withType(SharedLibraryBinary) {
// sharedLibraryFile = file("${lib_distribution_root}/gperf/lib/${targetPlatform.getName()}/libgperf.so")
// }
//}
}
}
android {
compileSdkVersion = 25
buildToolsVersion = '25.0.0'
defaultConfig {
applicationId='com.gfk.mediawatchapp'
minSdkVersion.apiLevel = 17
targetSdkVersion.apiLevel = 25
versionCode = 22
versionName = '255.0.4'
// Enabling multidex support.
//multiDexEnabled true
}
ndk {
platformVersion = 17
moduleName = 'mwlib'
toolchain = "clang"
stl = 'gnustl_static'
cppFlags.add('-std=c++11')
ldLibs.addAll(['android', 'log', 'OpenSLES', 'atomic'])
//build a default combined apk including all ABIs.
//abiFilters.addAll(['armeabi-v7a'])
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'x86']) //this is default
}
sources {
main {
jni {
dependencies {
library 'nativeaudio' linkage 'shared'
library 'fpextractor' linkage 'shared'
// if gperf were *.a, change shared --> static
//library 'gperf' linkage 'shared'
}
}
jniLibs {
// for shared lib, lib need to be pushed to the target too
// Once libs are copied into app/src/main/jniLibs directory,
// Android Studio will pack them into APK's lib/ directory
// Here we like to avoid another duplication by pointing
// to the files that containing our libs' distribution location
// so the same file is used by compiler at host, also packed
// into APk to be used at Target (phone/tablet)
source {
srcDir "${lib_distribution_root}/nativeaudio/lib"
srcDir "${lib_distribution_root}/fpextractor/lib"
//srcDir "${lib_distribution_root}/gperf/lib"
}
}
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles.add(file('proguard-android.txt'))
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
}
dependencies {
println rootProject.getName()
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:support-v4:25.3.1'
compile 'commons-net:commons-net:3.5'
//compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.google.android.gms:play-services-appindexing:9.8.0'
compile 'com.amazonaws:aws-android-sdk-core:2.4.2'
compile 'com.amazonaws:aws-android-sdk-s3:2.4.2'
compile 'com.amazonaws:aws-android-sdk-ddb:2.4.2'
compile 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.4.2'
}
// Unnecessary dependency management:
// Make sure the libs are available when begin compiling application project
// This could be ignored because in real scenario, the pre-built libs are
// already given to us before creating application.
tasks.whenTaskAdded { task ->
if (task.name.contains('compile')) {
task.dependsOn ':nativeaudio:distributeLib'
task.dependsOn ':fpextractor:distributeLib'
}
}
Please: Can anyone help me to understand why I have always the following error:
No signature of method:
org.gradle.model.ModelMap.getDefaultProguardFile() is applicable for
argument types: (java.lang.String) values: [proguard-android.txt]
Gradle experimental does not include getDefaultProguardFile() since it does not have any version of ProGuard config by default.
You can use move the lines from your proguard-android.txt to proguard-rules.pro and then change this line:
proguardFiles.add(file('proguard-android.txt'))
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
into this:
proguardFiles.add(file('proguard-rules.pro'))
For me adding a manifest with
jar {
manifest {
attributes 'Main-Class': com.package.to.main.Class
}
}
helped.
See here: Creating runnable JAR with Gradle

Using Prebuilt library in Android Studio

I'm making a jni Function in android to generate file checkSum using BoringSSL.
So I built boringssl to shared Library for use Prebuilt Library in Android studio.
The build output like this.
I copied the *.so file to my project src/main/jniLibs/lib
and BoringSSL include folder to src/main/jni
I referenced this project and apply to my projects.
https://github.com/googlesamples/android-ndk/tree/master/hello-libs
My build.gradle file like this.
I'm using gradle-experimental:0.7.0( and Window10, Android Studio 2.1.2 )
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
boringssl {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/lib/libcrypto.so")
sharedLibraryFile = file("src/main/jniLibs/lib/libssl.so")
}
}
}
}
android {
compileSdkVersion = 24
buildToolsVersion = '24.0.1'
defaultConfig {
applicationId = 'yein.a'
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 24
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'hello-libs'
ldLibs.addAll(['android', 'log'])
}
sources {
main {
jni {
dependencies {
library 'boringssl' linkage 'shared'
}
}
jniLibs{
source{
srcDir "src/main/jniLibs/lib"
}
}
}
}
productFlavors{
create("arm"){
ndk.abiFilters.add("armeabi-v7a")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.1.1'
}
This is my project structure.
I think I properly apply the example projects, because it is not occurred gradle sync error.
And when I use MD5 function Android Studio auto complete function name like this.
But I click run it occurred error like this...
I searched a lot project in google,github, and of course stackoverflow previous answers but I still not solve my problem.
I tried change gradle version but other gradle version occurred error in auto generated jni function except gradle-experimental:0.7.0.
Could anyone point me in the right direction or even a solution?
Thanks for read my Question.
you can try to call the java API from JNI, there is a nice tutorial here, Google recommends on this site you should call the java API or you can link the libraries as you did.
If you can't or don't want to call the java API you can always use CRC32 instead of MD5, CRC32 uses the libz library and that library is already on the NDK files. CRC32 in C.
#include <zlib.h>
int checkSumCRC32(char *text){
long n = crc32(0, (const void*)text, strlen(text));
printf("CRC32 %d", n);
return n;
}
Remember to add ldLibs.addAll(['z']) to your Gradle file
In case you need MD5 and BoringSSL this is my gradle.build file for BoringSSL.
Note: I am using the 3 libraries you compile on ubuntu, libssl.a libcrypto.a and libdecrepit.a
Note2: I am using com.android.tools.build:gradle-experimental:0.7.0-alpha4
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
libcrypto {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/crypto/libcrypto.a")
}
}
libssl {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/ssl/libssl.a")
}
}
libdecrepit {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/decrepit/libdecrepit.a")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig {
applicationId = "net.app"
minSdkVersion.apiLevel = 9
targetSdkVersion.apiLevel = 23
versionCode = 1
}
ndk {
platformVersion = 21
moduleName = "modulename"
toolchain = "clang"
abiFilters.addAll([ 'armeabi-v7a'])
CFlags.addAll(["-fvisibility=hidden", "-fpic"])
ldLibs.addAll(['log', 'z', 'android']) //Libreria llog, lz y landroid
}
sources {
main {
jni{
dependencies {
library "libcrypto" linkage "static"
library "libssl" linkage "static"
library "libdecrepit" linkage "static"
}
}
}
}
}
}
I haven't used MD5 but I have used SHA256 using boringSSL and it works fine. You can use it too as a checksum method. This is my method for SHA256.
char *sha256(char *str){
unsigned char hash[SHA256_DIGEST_LENGTH];
char *output = (char *) malloc(sizeof(char)*((SHA256_DIGEST_LENGTH*2)+1));
if (output == NULL) {
return NULL;
}
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str, strlen(str));
SHA256_Final(hash, &sha256);
int i;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++){
sprintf(&output[i*2], "%02x", (unsigned int)hash[i]);
}
return output;
}

Error:No such property: targetPlatform for class: com.android.build.gradle.managed.NdkConfig

I am trying to build FFMPEG into my JNI code with gradle in Android Studio. I have build FFMPEG as a .so file, in order to adapt different platform, I build it for different ABI(arm64-v8a, armeabi-v7a, mip, etc).Then I need to determine the ABI of the current build in the build.gradle file.
Refer Experimental Plugin User Guide, my build.gradle look like this:
apply plugin: 'com.android.model.native'
model{
repositories {
prebuilt(PrebuiltLibraries){
ffmpeg{
headers.srcDir "src/main/jni/build/${targetPlatform.getName()}/include"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jni/build/${targetPlatform.getName()}/libvflibrary.so")
}
}
}
}
android {
compileSdkVersion = 24
buildToolsVersion = "23.0.3"
defaultConfig {
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 24
versionCode = 1
versionName = "1.0"
}
ndk{
//platformVersion = 21
moduleName = "library-jni"
stl = 'gnustl_static'
toolchain = "clang"
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips'])
cppFlags.addAll(['-std=c++11', '-D__STDC_CONSTANT_MACROS'])
ldLibs.addAll(['log', 'android', 'z', 'EGL', 'GLESv2'])
}
sources {
main {
jni {
source{
srcDirs 'src/main/jni'
}
dependencies {
library 'ffmpeg' linkage 'shared'
}
}
}
}
}
}
I am getting an error:
Error:No such property: targetPlatform for class:
com.android.build.gradle.managed.NdkConfig.
Does anyone have an idea on how I can solve this, please?

How to build sipdroid in Android Studio?

I downloaded sipdroid project from here and tried to import in Android Studio. While building error:
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.`
I created file with name gradle.properties and added android.useDeprecatedNdk=true
Then while building I had errors with including libs, for example:
#include <myinttypes.h>
#include <spandsp/telephony.h>
#include <spandsp/g722.h>
#include <spandsp/private/g722.h>
And one more error:
Error:Execution failed for task ':app:compileDebugNdk'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Users....\ndk-bundle\ndk-build.cmd'' finished with non-zero exit value 2
What's wrong? How to build project without this errors?
At first, you always can build jni-part with command line, doing this way:
$ export NDK_PROJECT_PATH=/opt/umake/AndroidStudioProjects/Sipdroid/app/src/main
$ /opt/umake/android/android-ndk/ndk-build
and create gradle.properties file with
android.useDeprecatedNdk=true
at the root of the project.
And with new build.gradle (Module: app) will be this:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.0.1"
defaultConfig {
applicationId "org.sipdroid.sipua"
minSdkVersion 5
targetSdkVersion 21
ndk {
moduleName "OSNetworkSystem"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets.main.jni.srcDirs = [] // disable automatic ndk-build call, which ignore our Android.mk
sourceSets.main.jniLibs.srcDir 'src/main/libs'
}
Its works for me.
Usually I use Experimental Android Gradle Plugin, it much better for native projects. After import sipdroid to Android Studio you need to change build.gradle (Module: app) to this:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 21
buildToolsVersion = "21.0.1"
defaultConfig.with {
applicationId = "org.sipdroid.sipua"
minSdkVersion.apiLevel = 10
targetSdkVersion.apiLevel = 21
}
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
/*
* native build settings
*/
android.ndk {
moduleName = "OSNetworkSystem"
/*
* Other ndk flags configurable here are
* cppFlags.add("-fno-rtti")
* cppFlags.add("-fno-exceptions")
* ldLibs.addAll(["android", "log"])
* stl = "system"
*/
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
android.productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" #
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}
and change classpath in build.gradle (whole project, root directory) from
'com.android.tools.build:gradle:1.5.0'
to
'com.android.tools.build:gradle-experimental:0.4.0'
and delete gradle.properties file with 'android.useDeprecatedNdk=true' at the root of the project.
After build Android Studio will eliminate with Gradle Build Messages lots of errors in sources with includes, and locate them by clicking at corresponding message.
I don't see any other variants with Experimental Android Gradle Plugin, rather than to change includes in cpp and c-files like this:
Such as in ndk/silk/src/SKP_Silk_main_FIX.h:
#include "SKP_Silk_typedef.h"
to
#include "../interface/SKP_Silk_typedef.h"
It's sad that this fragment synch with Gradle Experimental Plugin gratefully, but hasn't effect.
android.sources {
main {
jni {
source {
srcDirs = []
}
}
}
}
There is the solution from
How to use custom Android.mk with new gradle build system
android.sources{
main.jni {
source {
srcDirs = []
}
}
main.jniLibs {
source {
srcDirs = ['src/main/libs']
}
}
}
It seems a bug in plugin gradle-experimental:0.4.0 throws this error
BError:Attempt to read a write only view of model of type 'java.lang.Object' given to rule 'model.android.sources'
but gradle-experimental:0.3.0-alpha7 works fine if remove jni and save only libs directory.

Categories

Resources