Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build an Android Gradle based app with NDK only for the ARM target?

I have a .so file from vendor which only support "arm". Currently it works perfectly fine for my Android application. Somehow I want to separate the implementation using Android Studio module, so I can export the module as Jar following this tutorial https://www.youtube.com/watch?v=1i4I-Nph-Cw.

When I export the JAR, the build process returns an error

/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: skipping incompatible src/main/jniLibs/armeabi/libremote_client.so when searching for -lremote_client
/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: cannot find -lremote_client
collect2: error: ld returned 1 exit status

:app:linkMipsDebugRemoteDesktopSharedLibrary FAILED

FAILURE: Build failed with an exception.

The logs says that gradle was trying to build against mips but failed due the incompatible library, since I only have arm library. My question how to skip the build process against mips? Or is it possible to target ARM only architecture?

build.gradle

apply plugin: 'com.android.model.library'

model {
android {
    compileSdkVersion = 23
    buildToolsVersion = "22.0.1"

    defaultConfig.with {
        //applicationId = "com.test.remote"
        minSdkVersion.apiLevel = 19
        targetSdkVersion.apiLevel = 21
        //versionCode = 1
        //versionName = "1.0"
    }

}

android.ndk {
    moduleName = "remote_client"
    //CFlags += "-DANDROID_NDK"
    CFlags += ['-std=c99', '-fstrict-aliasing']
    ldLibs += ["log", "remoted_client"]
}

android.buildTypes {
    release {

        minifyEnabled = false
        proguardFiles += file('proguard-rules.pro')
    }
}

android.sources {
    main {
        jni {
            source {
                srcDir 'src/main/jni'
            }
        }
        jniLibs {
            source {
                srcDir 'src/main/jniLibs'
            }
        }
    }
}

android.productFlavors {
    create("arm") {
        ndk.with {
            abiFilters += "armeabi"
            ldFlags += "-Lsrc/main/jniLibs/armeabi"
        }
    }
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}


task clearJar(type: Delete) {
delete 'mylib.jar'
}

task makeJar(type: Copy) {
   from('build/intermediates/bundles/release/')
   into('release/')
   include('classes.jar')
   rename ('classes.jar', 'mylib.jar')
}

makeJar.dependsOn(clearJar, build)
like image 779
zoom Avatar asked Oct 22 '15 09:10

zoom


People also ask

What is arm64 v8a abi?

arm64-v8a. This ABI is for ARMv8-A based CPUs, which support the 64-bit AArch64 architecture. It includes the Advanced SIMD (Neon) architecture extensions. You can use Neon intrinsics in C and C++ code to take advantage of the Advanced SIMD extension.


1 Answers

Tested on Android SDK 26, NDK 15.2

On the file app/build.gradle:

android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a'

will build only for arm64-v8a, or for all currently non-deprecated ARM targets:

abiFilters 'arm64-v8a', 'armeabi-v7a'

ABI list currently at: https://developer.android.com/ndk/guides/abis.html

Tested on Ubuntu 17.10 host, Android Studio 3, Android SDK 26, NDK 15.2, and an Android 6.0.1 device.

Sample project on GitHub.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!