【问题标题】:Migrating Android ndk app to Android Studio (gradle-experimental 0.2.0)将 Android ndk 应用程序迁移到 Android Studio (gradle-experimental 0.2.0)
【发布时间】:2015-12-14 03:29:36
【问题描述】:

我已尝试根据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/wrapper/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

app/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')
}

app/src/main/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)

【问题讨论】:

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


    【解决方案1】:

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

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

    当涉及到 lib 使用时,cmake 要简单得多。如果你选择cmake,例子在同一个repo,master-cmake 分支。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        简单的方法是迁移 NDK 项目不要导入项目,请使用相同的包名称复制您的文件,并在依赖项中添加支持库以正确同步 Gradel,并支持 min 和 max。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多