项目从 Eclipse 移植到 Studio

Project porting from Eclipse to Studio

我有一个 android 应用程序一直在使用 OpenGL 库和 PVRTC 工具。 在 API 19 之前,此应用程序在 Eclipse 上 运行 完美。现在我想将其移动到 API 23,因此考虑将应用程序移植到 Android Studio 以供将来更新同步。我在移植过程中遇到问题,请查看屏幕截图以查看我在 Eclipse 运行 代码

中的文件夹层次结构

[


[

以下是我的 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 'com.android.tools.build:gradle-experimental:0.2.0' "

我的应用程序模块 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 工具被忽略了。

任何帮助将不胜感激。

您没有义务放弃您精心制作的 Android.mk 以换取实验性 gradle 插件的未完善和有限的 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']
        }
    }
}