项目从Eclipse移植到Studio

时间:2015-11-06 10:31:54

标签: android android-studio opengl-es java-native-interface pvrtc

我有一个Android应用程序,它一直在使用OpenGL库和PVRTC工具。 这个应用程序在Eclipse上运行完美,直到API 19.现在我想将其移至API 23,以便将应用程序移植到Android Studio以及将来的更新同步。我在此移植中遇到问题请查看屏幕截图以查看我在Eclipse中运行代码的文件夹层次结构

[the project folder hierarchy

[inside the jni folder]

以下是我的 Android.mk 文件:

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)

这是Eclipse中的 Application.mk 文件

# 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

我使用的是Android Studio 1.4版,Gradle Built 2.5

将classpath设置为“classpath”com.android.tools.build:gradle-experimental:0.2.0'“

我的app模块built.gradle看起来像

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'
}

我实际上无法配置应用程序,在同步时总是会出现错误,例如

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

任何人都可以查看它并对我的 build.gradle 文件进行更正。我猜测PVRTC工具被忽略了。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您没有义务放弃经过精心设计的 Android.mk ,用于实验性gradle插件的未经修改且有限的DSL。有关详情,请参阅 define LOCAL_SRC_FILES in ndk{} DSL

您的案例中的具体问题似乎不是PVRTC文件被忽略,而是根据Tools/OGLES2/Build/Android/Android.mk中配置的规则和标志编译它们。

TL; NR:将以下行附加到 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']
        }
    }
}