如何在android studio中创建一个c ++类(.h和.cpp)?

时间:2017-04-07 11:53:56

标签: android c++ android-ndk android-studio-2.3

我正在学习使用android NDK并尝试创建本机c ++类(.h和.cpp)。我按照官方教程(https://developer.android.com/studio/projects/add-native-code.html)来实现这一目标。我设法创建一个简单的c ++类并从java调用它,没问题。

现在我想用一个什么都不做的构造函数来创建我自己的c ++类(让我们说一个HellowWorld类)。要做到这一点,我右键单击我的cpp文件夹,其中包含我已经工作的JNI包装器。

我创建了我的类并创建了一个默认构造函数并从我的JNI函数中调用它,但它在编译期间崩溃了:

  

错误:FAILURE:构建因异常而失败。

  • 出了什么问题: 任务':app:externalNativeBuildDebug'执行失败。

      

    构建命令失败。   使用参数{--build C:\ Users \ lucien.moor \ Desktop \执行'C:\ Users \ lucien.moor \ AppData \ Local \ Android \ Sdk \ cmake \ 3.6.3155560 \ bin \ cmake.exe'时出错tmp \ MyApplication2 \ app.externalNativeBuild \ cmake \ debug \ mips64 --target native-lib}   [1/2]构建CXX对象CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o   [2/2]链接CXX共享库........ \ build \ intermediates \ cmake \ debug \ obj \ mips64 \ libnative-lib.so   FAILED:cmd.exe / C“cd。&& C:\ Users \ lucien.moor \ AppData \ Local \ Android \ sdk \ ndk-bundle \ toolchains \ llvm \ prebuilt \ windows-x86_64 \ bin \ clang ++。exe --target = mips64el-none-linux-android --gcc-toolchain = C:/Users/lucien.moor/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/ windows-x86_64 --sysroot = C:/Users/lucien.moor/AppData/Local/Android/sdk/ndk-bundle/platforms/android-21/arch-mips64 -fPIC -g -DANDROID -ffunction-sections -funwind- tables -fstack-protector-strong -no-canonical-prefixes -Wa, - noexecstack -Wformat -Werror = format-security -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-前缀-Wa, - noexecstack -Wformat -Werror = format-security -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info -Wl, - build-id -Wl, - warn- shared-textrel -Wl, - fatal-warnings -Wl, - no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl, - build -id -Wl, - warn-shared-textrel -Wl, - 致命警告-Wl, - no-und efined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ........ \ build \ intermediates \ cmake \ debug \ obj \ mips64 \ libnative-lib.so CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o -llog -lm“C:/ Users / lucien。 moor / AppData / Local / Android / sdk / ndk-bundle / sources / cxx-stl / gnu-libstdc ++ / 4.9 / libs / mips64 / libgnustl_static.a“&& cd。“   CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o:在函数Java_he_1arc_myapplication2_MainActivity_stringFromJNI': C:\Users\lucien.moor\Desktop\tmp\MyApplication2\app\src\main\cpp/native-lib.cpp:10: undefined reference to HelloWorld :: HelloWorld()'   clang ++。exe:错误:链接器命令失败,退出代码为1(使用-v查看调用)   忍者:构建停止:子命令失败。

  • 尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。

我认为链接.h和.cpp文件时出现问题。当我尝试实现我的构造函数内联时,它工作正常。它只是找不到.cpp实现。

这是我的JNI native-lib.cpp文件:

#include <jni.h>
#include <string>
#include "HelloWorld.h"

extern "C"
jstring
Java_he_1arc_myapplication2_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
HelloWorld t;
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

这是我的Helloworld.h:

#ifndef MYAPPLICATION2_HELLOWORLD_H
#define MYAPPLICATION2_HELLOWORLD_H


class HelloWorld {
public:
     HelloWorld();
};
#endif //MYAPPLICATION2_HELLOWORLD_H

这是我的HelloWorld.cpp

#include "HelloWorld.h"
HelloWorld::HelloWorld() { }

当我打开这个文件时,android studio告诉我 “这个文件不是项目的一部分。请将它包含在相应的构建文件中(build.gradle,CMakeLists.txt或Android.mk等) 。)并同步项目。“

所以,我如何将这些可爱的.h和.cpp链接在一起?

2 个答案:

答案 0 :(得分:4)

我找到了解决方案!

如消息所示,我必须在CMakeLists.txt中添加我的文件。头文件不是必需的,但必须在CMakeLists.txt

中添加.cpp文件

为了让链接器找到实现文件,我必须添加

src/main/cpp/HelloWorld.cpp in my CMakeLists.txt

以下是完整的CMakeLists文件:

cmake_minimum_required(VERSION 3.4.1)
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).
         # Associated headers in the same location as their source
         # file are automatically included.
         src/main/cpp/native-lib.cpp
         src/main/cpp/HelloWorld.cpp)
find_library( # Sets the name of the path variable.
          log-lib

          # Specifies the name of the NDK library that
          # you want CMake to locate.
          log )
target_link_libraries( # Specifies the target library.
                   native-lib
                   # Links the target library to the log library
                   # included in the NDK.
                   ${log-lib} )

答案 1 :(得分:0)

public:
 HelloWorld();

至少应该是

public:
 HelloWorld()
   {
   //......
   }