Search code examples
androidandroid-ndkjava-native-interface

Android native implementation throws make: ***No rule to make target


This is my first native implementation android app, which I followed online tutorial with some tweaks to fit my needs. I found a lot of SO answers to the above error but none of them worked for me. I added ndk-build to my environment variables. Yet I get I get this when I execute ndk-build from the command line.

C:\Users\AndroidStudioProjects\myapp\app\src\main\jni>ndk-build
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14.
Android NDK: WARNING: APP_PLATFORM android-14 is higher than android:minSdkVersion 1 in C:/Users/AndroidStudioProjects/myapp/app/src/main/AndroidManifest.xml. NDK binaries will *not* be comptible with devices older than android-14. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
make: *** No rule to make target `C:/Users/AndroidStudioProjects/myapp/app/src/main/jni/libglimage.c', needed by `C:/Users/AndroidStudioProjects/myapp/app/src/main/obj/local/arm64-v8a/objs/glimage-jni/libglimage.o'.  Stop.

When I execute ndk-build from android studio terminal I get

C:\Users\AndroidStudioProjects\myapp\app\src\main\jni>ndk-build
'ndk-build' is not recognized as an internal or external command,
operable program or batch file.

When I build suing gradle, I get the following

make: *** No rule to make target `C:/Users/AndroidStudioProjects/myapp/app/src/main/jni/libglimage.c', needed by `C:/Users/AndroidStudioProjects/myapp/app/build/intermediates/ndkBuild/release/obj/local/armeabi/objs/glimage-jni/libglimage.o'.  Stop.
process_begin: CreateProcess(NULL, "", ...) failed.
Error while executing process C:\Users\AppData\Local\Android\sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\AndroidStudioProjects\myapp\app\src\main\jni\Android.mk APP_ABI=armeabi NDK_ALL_ABIS=armeabi NDK_DEBUG=0 APP_PLATFORM=android-19 NDK_OUT=C:/Users/AndroidStudioProjects/myapp/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT=C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\release\lib APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n}
Build command failed.
make: *** No rule to make target `C:/Users/AndroidStudioProjects/myapp/app/src/main/jni/libglimage.c', needed by `C:/Users/AndroidStudioProjects/myapp/app/build/intermediates/ndkBuild/debug/obj/local/armeabi/objs-debug/glimage-jni/libglimage.o'.  Stop.
process_begin: CreateProcess(NULL, "", ...) failed.
C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe "directory C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../sysroot C:/Users/AndroidStudioProjects/myapp/app/src/main/jni C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../sources/cxx-stl/system" >> C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib/armeabi/gdb.setup
C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe "set solib-search-path C:/Users/AndroidStudioProjects/myapp/app/build/intermediates/ndkBuild/debug/obj/local/armeabi" > C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib/armeabi/gdb.setup
C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi] "Gdbsetup       ": "C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib/armeabi/gdb.setup"
copy /b/y "C:\Users\AppData\Local\Android\sdk\ndk-bundle\build\\..\prebuilt\android-arm\gdbserver\gdbserver" "C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib\armeabi\gdbserver" > NUL
C:/Users/AppData/Local/Android/sdk/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi] "Gdbserver      ": "[arm-linux-androideabi] C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib/armeabi/gdbserver"
md "C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib\armeabi" >NUL 2>NUL || rem
Error while executing process C:\Users\AppData\Local\Android\sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\AndroidStudioProjects\myapp\app\src\main\jni\Android.mk APP_ABI=armeabi NDK_ALL_ABIS=armeabi NDK_DEBUG=1 APP_PLATFORM=android-19 NDK_OUT=C:/Users/AndroidStudioProjects/myapp/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=C:\Users\AndroidStudioProjects\myapp\app\build\intermediates\ndkBuild\debug\lib APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n}
Build command failed.
External Native Build Issues

These are the contents of my Application.mk and Android.mk respectively /***/

APP_PLATFORM := android-14
APP_ABI := all

/***/

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libglimage-jni
LOCAL_SRC_FILES := libglimage.c
include $(BUILD_SHARED_LIBRARY)

The following is partial code of my Java class

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        nativeSetSurface(holder.getSurface());
    }

    public void surfaceCreated(SurfaceHolder holder) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        nativeSetSurface(null);
    }


    public static native void nativeOnStart();
    public static native void nativeOnResume();
    public static native void nativeOnPause();
    public static native void nativeOnStop();
    public static native void nativeSetSurface(Surface surface);

    /*static {
        System.loadLibrary("nativeegl");
    }*/
    static {
        System.loadLibrary("libglimage");
    }

This is my build.gradle content. As you can see minsdkVersion is higher that 14 opposite of what the ndk-build is spitting on me.

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "mypackage"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            moduleName "libglimage"
            ldLibs "log", "android", "EGL", "GLESv1_CM"
        }
    }

    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile files('libs/Vuforia.jar')
}

Please help if you can figure out what is going on.


Solution

  • I fixed it by changing my local src line to refer to my .cpp files as follows

    LOCAL_SRC_FILES := jniapi.cpp renderer.cpp