androidandroid-studioopengl-esjava-native-interfacepvrtc

Project porting from Eclipse to Studio


I have an android application which is been using OpenGL libraries and PVRTC Tool. This application was running perfectly on Eclipse till API 19. Now I want to move this till API 23 so think to port the application to Android Studio as well for future updates sync. I am facing problems in this porting please look up the screenshots to see the folder hierarchy I have in Eclipse running code

[the project folder hierarchy


[inside the jni folder]

Following was my Android.mk file:

LOCAL_PATH := $(call my-dir)
PVRSDKDIR := $(LOCAL_PATH)
include $(PVRSDKDIR)/Tools/OGLES2/Build/Android/Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE    := nativeegl
LOCAL_CFLAGS    := -DBUILD_OGLES2 -Wall -g
LOCAL_SRC_FILES := CCAppMain.cpp 
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv2# -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := \
                          ogles2tools \
                          android_native_app_glue

LOCAL_C_INCLUDES := \
                    $(PVRSDKDIR)/Builds/OGLES2/Include  \
                    $(PVRSDKDIR)/Tools  \
                    $(PVRSDKDIR)/Tools/OGLES2
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)

And this is respective Application.mk file in Eclipse

# The ARMv7 is significanly faster due to the use of the hardware FPU
#APP_ABI := armeabi armeabi-v7a x86
#APP_OPTIM := release
APP_STL := stlport_static

I am using Android Studio Version 1.4 , Gradle Built 2.5

have set classpath as "classpath 'com.android.tools.build:gradle-experimental:0.2.0' "

My app module built.gradle looks like

apply plugin: 'com.android.model.application'
model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.1"
        defaultConfig.with {
            applicationId    = "xxx"
            minSdkVersion.apiLevel    = 14
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    compileOptions.with {
        sourceCompatibility=JavaVersion.VERSION_1_7
        targetCompatibility=JavaVersion.VERSION_1_7
    }
    android.ndk {
        moduleName = "nativeegl"
        //cppFlags  += "-I${file("src/main/jni/native_app_glue")}".toString()
        cppFlags  += "-I${file("src/main/jni")}".toString()
        cppFlags  += "-I${file("src/main/jni/Tools")}".toString()
        cppFlags  += "-I${file("src/main/jni/Tools/OGLES2")}".toString()
        cppFlags  += "-I${file("src/main/jni/Tools/OGLES2/GLES2")}".toString()
        ldLibs    += ["android", "EGL", "GLESv2", "OpenSLES", "log"]
        stl        = "stlport_static"
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles  += file('proguard-rules.txt')
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:support-v4:23.0.1'
}

I am really not able to configure the application at moment, On syncing it always giving errors such as

Error:Execution failed for task ':app:compileArmeabi-v7aDebugNativeeglSharedLibraryNativeeglMainCpp'.
> Multiple build operations failed.
      C++ compiler failed while compiling PVRTPrint3D.cpp.
      C++ compiler failed while compiling PVRTBackground.cpp.
      C++ compiler failed while compiling PVRTShader.cpp.
      C++ compiler failed while compiling PVRTPrint3DAPI.cpp.
      C++ compiler failed while compiling PVRTPFXParserAPI.cpp.
  See the complete log at: file:///E:/Android_Studio_Project/XXX/app/build/tmp/compileArmeabi-v7aDebugNativeeglSharedLibraryNativeeglMainCpp/output.txt

Can anyone look into it and make correction to my build.gradle file. I am guessing that PVRTC tool is been ignored in it.

Any help will be appreciated.


Solution

  • You are not obliged to forsake your carefully crafted Android.mk for the unpolished and limited DSL of the experimental gradle plugin. See more at define LOCAL_SRC_FILES in ndk{} DSL.

    The specific problem in your case seems to be not that the PVRTC files are ignored, but that they are not compiled according to the rules and flags as configured in Tools/OGLES2/Build/Android/Android.mk.

    TL;NR: append the following lines to you build.gradle:

    def ndkBuild = android.ndkDirectory
    import org.apache.tools.ant.taskdefs.condition.Os
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        ndkBuild += '.cmd'
    }
    
    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        commandLine '$ndkBuild', '-C', 'src/main'
    }
    
    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        commandLine '$ndkBuild', 'clean', '-C', 'src/main'
    }
    
    clean.dependsOn 'cleanNative'
    
    tasks.all {
        task ->
            if (task.name.startsWith('compile') && task.name.contains('MainC')) {
                task.enabled = false
            }
            if (task.name.startsWith('link')) {
                task.enabled = false
            }
            if (task.name.endsWith("SharedLibrary") ) {
                task.dependsOn buildNative
            }
    }
    
    android {
        sourceSets {
            main {
                jniLibs.srcDirs = ['src/main/libs']
            }
        }
    }