android studio编译C++问题

Saxon 2014-03-04 07:12:31
筒子们,请教个问题
我的环境是ubunt, Android Studio,现在要写个带native的应用

我的C++代码中有这么一句:
#include <string>
在Application.mk中有这么一句
APP_STL := gnustl_static

然后在命令行模式下运行ndk-build,能正常编译通过并生成好相关的.so到对应的目录下去
然后用Android Studio编译生成apk,就报如下错误,请教各位,有什么解决办法么?谢谢先

In file included from /home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/main.cpp:43:0:
/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/RunParameters.h:43:18: fatal error: string: No such file or directory
compilation terminated.
make: *** [/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/build/ndk/arm/debug/obj/local/armeabi/objs/MusicToolbox//home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/main.o] Error 1

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':MusicToolbox:compileArmDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/home/leo/android-ndk-r9c/ndk-build NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/build/ndk/arm/debug/Android.mk APP_PLATFORM=android-19 NDK_OUT=/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/build/ndk/arm/debug/obj NDK_LIBS_OUT=/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/build/ndk/arm/debug/lib APP_ABI=armeabi
Error Code:
2
Output:
In file included from /home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/main.cpp:43:0:
/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/RunParameters.h:43:18: fatal error: string: No such file or directory
compilation terminated.
make: *** [/home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/build/ndk/arm/debug/obj/local/armeabi/objs/MusicToolbox//home/leo/source/ics_apple/packages/apps/MusicToolbox/MusicToolbox/src/main/jni/SoundStretch/main.o] Error 1


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
...全文
7467 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
16bit_integer 2016-08-13
  • 打赏
  • 举报
回复
引用 5 楼 Saxon 的回复:
[quote=引用 4 楼 jzp12 的回复:] RunParameters.h的第43行是#include <string>? 看一下为什么包含不到c++标准的string头文件。
============================================== 多谢,最后,解决的办法是在build.gradle中添加 ndk { moduleName "soundtouch" stl "stlport_static" abiFilters "armeabi", "armeabi-v7a" } 解决了这个错误 原因是,Android Studio并没有用jni目录下的Android.mk和Application.mk去生成它编译的时候的Android.mk(这个文件的路径是: build/ndk/arm/debug/Android.mk) 至于Android Studio为什么没有用这两个文件,我现在也没搞清楚,如果哪位解决了,请更新一下,造福大家[/quote] 请问怎么配置使用c++11?
mmmm2000030 2016-05-10
  • 打赏
  • 举报
回复
然而楼主找到解决方法了吗?
ameyume 2015-12-09
  • 打赏
  • 举报
回复
build.gradle提示找不到符号jniLIbs,jni, OS等。 cannot resovle symbol 'jniLibs'
ameyume 2015-12-09
  • 打赏
  • 举报
回复
好像两种编译方式都可以。 但我现在有个问题,就是我在jni目录下有多个C++文件,在jni文件中用到了同目录下的其他C++类,已经引入头文件,但是编译还是找不到类。在mk文件LOCAL_SRC_FILES := \已经引入了相关类。
ameyume 2015-12-09
  • 打赏
  • 举报
回复
引用 6 楼 wxl2578 的回复:
这个是需要设置ndk-build的工作路径的,设置为jni目录,这样就会调用自定义的mk文件了: 模块下的build.gradle下设置,给个例子:
import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "dexloader"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.3'
}
前提是要把ndk的环境变量要配置好,local.properties也不用配置ndk路径了
你好,有两个问题请教下: 1.请问这样使用自定义的mk文件编译的时候,生成的so库的名字是以build.gradle中定义的 moduleName "dexloader" 为准,还是mk文件中定义的 LOCAL_MODULE := xxxx_jni 为准? 2.编译生成so时是通过android studio build make模块生成还是直接用ndk-build命令生成?还是两者都行? 多谢。
不屈意志 2015-01-23
  • 打赏
  • 举报
回复
这个是需要设置ndk-build的工作路径的,设置为jni目录,这样就会调用自定义的mk文件了: 模块下的build.gradle下设置,给个例子:
import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "dexloader"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.3'
}
前提是要把ndk的环境变量要配置好,local.properties也不用配置ndk路径了
Saxon 2014-03-14
  • 打赏
  • 举报
回复
引用 4 楼 jzp12 的回复:
RunParameters.h的第43行是#include <string>? 看一下为什么包含不到c++标准的string头文件。
============================================== 多谢,最后,解决的办法是在build.gradle中添加 ndk { moduleName "soundtouch" stl "stlport_static" abiFilters "armeabi", "armeabi-v7a" } 解决了这个错误 原因是,Android Studio并没有用jni目录下的Android.mk和Application.mk去生成它编译的时候的Android.mk(这个文件的路径是: build/ndk/arm/debug/Android.mk) 至于Android Studio为什么没有用这两个文件,我现在也没搞清楚,如果哪位解决了,请更新一下,造福大家
Saxon 2014-03-05
  • 打赏
  • 举报
回复
引用 1 楼 Java_Devil 的回复:
RunParameters 这个头文件没找到么。。。
应该是#include <string>报的错,我改成#include <string.h>,这里不报错了,但是后边使用的地方又报错了
jzp12 2014-03-05
  • 打赏
  • 举报
回复
RunParameters.h的第43行是#include <string>? 看一下为什么包含不到c++标准的string头文件。
jzp12 2014-03-05
  • 打赏
  • 举报
回复
你是使用了std::string?
绝世酱油瓶 2014-03-04
  • 打赏
  • 举报
回复
RunParameters 这个头文件没找到么。。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧