将Android ndk应用迁移到Android Studio(gradle-experimental 0.2.0)

时间:2015-09-17 09:48:51

标签: android-studio gradle android-ndk migration android-gradle

我已尝试根据http://ph0b.com/new-android-studio-ndk-support/#usingndkbuild将现有的ndk项目转换为Android Studio,但无法解决所有错误。

现在我收到以下错误:

/home/nxp/Documents/Projects/Android_Ucode_demo/app/src/main/jni/ECDSA-jni.c 
Error:(44, 30) openssl/ossl_typ.h: No such file or directory

文件夹结构:

app
  build
    ...
  libs
    ...
  src
    main
      assets
        ...
      java
        ...
      jni
        include.openssl
          ...
          ossl_type.h
          ...
        Android.mk
        libcrypto-static.a
        ECDSA-jni.c
      jniLibs
        armeabi
          libECDSA.so
      res
        ...
      AndroidManifest
    app.iml
    build.gradle
    lint.xml
build
  ...
gradle
  ...
...
build.gradle
...

的build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        //classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.android.tools.build:gradle-experimental:0.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

的gradle /包装/ gradle-wrapper.properties

#Thu Sep 17 09:57:00 CEST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip

应用程序/的build.gradle

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

model {
    android {
        compileSdkVersion = 22
        buildToolsVersion = "23.0.1"

        defaultConfig.with {
            applicationId = "com.mycompany.myapp"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 22
        }
    }

    android.ndk {
        moduleName = "openssl"
    }



    android.sources{
        main.jni {
            source {
                srcDirs = ['src/main/jni']
            }
        }
        main.jniLibs {
            source {
                srcDirs = ['src/main/jniLibs']
            }
        }
    }

    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.txt')
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:22.0.0'
    compile files('libs/aretepoplib.jar')
}

应用程序/ SRC /主/ JNI / Android.mk

LOCAL_PATH := $(call my-dir)
$(info LOCAL_PATH := $(LOCAL_PATH))

include $(CLEAR_VARS)
LOCAL_MODULE := openssl
LOCAL_SRC_FILES = libcrypto-static.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include frameworks/base/include 
LOCAL_LDLIBS    := -llog -lGLESv2
LOCAL_MODULE    := ECDSA
LOCAL_SRC_FILES := ECDSA-jni.c
LOCAL_STATIC_LIBRARIES := openssl
include $(BUILD_SHARED_LIBRARY)

3 个答案:

答案 0 :(得分:3)

简单的方法是迁移NDK项目不要导入项目请使用相同的包名完全复制文件,并在依赖项中添加支持的lib正确地进行classl同步,并支持min和max。

答案 1 :(得分:0)

您可以享受ndk-build的全部功能,并通过Android Stidio中的本机调试获得实验级插件的支持,请参阅define LOCAL_SRC_FILES in ndk{} DSL

答案 2 :(得分:0)

错误是因为src / main / jni / include不在包含路径中,请将其添加到
     cppFlags.addAll([' -I' + file(' src / main / jni / include')]) 示例在Teapot中 主要是因为android studio / gradle递归编译源文件,但它不会在路径中添加子目录以包含路径;你需要手动处理它。

希望你没有在那里使用libcrypto-static.a:静态lib需要支持不同的ABI [检查你现有的application.mk],所以一个lib将有不同的二进制文件用于不同的ABI。建立自己和使用是很好的; Teapot将native-app-glue构建为静态lib并在本地使用它。对于libECDSA.so也是如此;除非你只为一种armeabi风格构建,否则Android Studio会抱怨没有找到其他ABI库。您可以在同一个仓库中检查hello-libs。

当涉及到lib使用时,cmake要简单得多。如果您选择cmake,则示例位于同一个repo,master-cmake分支中。