Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编译时错误:面临使用c+调用一个方法的问题+;在安卓工作室_Android_C++_Cmake_Android Ndk - Fatal编程技术网

Android 编译时错误:面临使用c+调用一个方法的问题+;在安卓工作室

Android 编译时错误:面临使用c+调用一个方法的问题+;在安卓工作室,android,c++,cmake,android-ndk,Android,C++,Cmake,Android Ndk,使用本机组件编译Android项目时出现以下错误: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:externalNativeBuildDebug'. Build command failed. Error while executing process /Volumes/DATA/android-sdk-mac_x86/cmake/3.10.2.49

使用本机组件编译Android项目时出现以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
 Build command failed.
  Error while executing process /Volumes/DATA/android-sdk-mac_x86/cmake/3.10.2.4988404/bin/ninja with arguments {-C /Volumes/DATA/Demos/AndroidCPPDemoApp/app/.cxx/cmake/debug/x86 native-lib}
  ninja: Entering directory `/Volumes/DATA/Demos/AndroidCPPDemoApp/app/.cxx/cmake/debug/x86'
  [1/3] Building C object CMakeFiles/native-lib.dir/GetTestFile.c.o
  [2/3] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o
  [3/3] Linking CXX shared library /Volumes/DATA/Demos/AndroidCPPDemoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
  FAILED: /Volumes/DATA/Demos/AndroidCPPDemoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so 
  : && /Volumes/DATA/android-sdk-mac_x86/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android16 --gcc-toolchain=/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64 --sysroot=/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sysroot -fPIC -isystem /Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sysroot/usr/include/i686-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot /Volumes/DATA/android-sdk-mac_x86/ndk-bundle/platforms/android-16/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -L/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o /Volumes/DATA/Demos/AndroidCPPDemoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o CMakeFiles/native-lib.dir/GetTestFile.c.o  -llog -latomic -lm "/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86/libc++_static.a" "/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86/libc++abi.a" "/Volumes/DATA/android-sdk-mac_x86/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86/libandroid_support.a" && :
  /Volumes/DATA/Demos/AndroidCPPDemoApp/app/src/main/cpp/GetTestFile.c:38: error: undefined reference to 'HttpGetOptBuffer'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.
这里是GetTestFile.c

#include "GetTestFile.h"
#include <stdlib.h>
#include <string.h>

extern int HttpGetOptBuffer(const char *Server, const char *FileName,
                            int (*DataProcFn)(void * data, int datalen, void *pParm, void *pHttp), void *pParm, int BufferContent, void *SessionCopy);

int HttpGetProcessData(void * data, int datalen, void *pParm, void *pHttp)
{
    int HttpContentLength = datalen;
    char *HttpContent = (char*)data;
    char **pContent = (char**)pParm;
    if(HttpContent && (HttpContentLength))
    {
        char *Content = (char*)malloc(HttpContentLength+1);
        if(Content)
        {
            char *dest = Content;
            //          int ContentLength = HttpContentLength;
            while(HttpContentLength--)
                *dest++=*HttpContent++;
            *dest = 0;  // NULL terminate
            *pContent = Content;
        }
    }

    return 0;
}


char *GetFile(const char *Server, const char *FileName)
{
    char *Content = NULL;
    int Rv = HttpGetOptBuffer(Server, FileName, HttpGetProcessData, &Content, 1, NULL);
    if(!Content || (Rv != 200))
        Content = "";
    return Content;
}

void ReleaseContent(char *Content)
{
    free(Content);
}
我在Android开发者网站的build.gradle文件中添加了基本配置

defaultConfig {
     externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
        }
    }
}

externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

代码段用于可在浏览器中执行的代码。您提供的任何代码(
.c
CMakeLists.txt
build.gradle
)都不能在浏览器中运行。请不要为它们使用代码片段。相反,将它们格式化为“普通”代码(使用
Ctrl+K
{}
按钮)。那么在GetTestFile文件的顶部,实际定义的
HttpGetOptBuffer
在哪里呢。此文件在iOS中运行良好。在android中,我们还有其他事情要做吗?请显示所有相关代码,包括
HttpGetOptBuffer
的定义和完整的CMake文件。@Artipatel这是声明,不是定义。您的错误是指找不到定义。代码段用于可在浏览器中执行的代码。您提供的任何代码(
.c
CMakeLists.txt
build.gradle
)都不能在浏览器中运行。请不要为它们使用代码片段。相反,将它们格式化为“普通”代码(使用
Ctrl+K
{}
按钮)。那么在GetTestFile文件的顶部,实际定义的
HttpGetOptBuffer
在哪里呢。此文件在iOS中运行良好。在android中,我们还有其他事情要做吗?请显示所有相关代码,包括
HttpGetOptBuffer
的定义和完整的CMake文件。@Artipatel这是声明,不是定义。你的错误是说找不到定义。
add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp

        GetTestFile.h

        GetTestFile.c

        )
defaultConfig {
     externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
        }
    }
}

externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}