Android Studio .cpp包含

时间:2017-11-14 04:00:54

标签: android java-native-interface header-files

我正在使用Android Studio(3.0)的最新版本,我开始在我的代码中使用本机C ++。

使用默认项目设置,一切都按预期工作;但是,我现在已经添加了dog.h和dog.cpp来测试链接。

dog.h

#ifndef TESTCPLUSPLUSHEADERTEST_DOG_H
#define TESTCPLUSPLUSHEADERTEST_DOG_H

#include <string>

std::string get_dog();

#endif //TESTCPLUSPLUSHEADERTEST_DOG_H

dog.cpp

#include "dog.h"

std::string get_dog() {
    return "dog";
}

本机lib.cpp

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

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_test_android_testcplusplusheadertest_MainActivity_getDogString(
        JNIEnv *env,
        jobject /* this */) {
    std::string dog = get_dog();
    ... [other code]
}

的CMakeLists.txt

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).
             src/main/cpp/native-lib.cpp )

add_library(
         dog
          SHARED
          src/main/cpp/dog.h
          src/main/cpp/dog.cpp
          )

find_library( log-lib
              log )

target_link_libraries( native-lib
                       ${log-lib} )

target_link_libraries( dog
                       ${dog} )

当我尝试运行时,出现以下错误:

Error:(25) undefined reference to 'get_dog()'

这可以通过将dog.cpp中的代码移动到dog.h中来解决。

这个类在Visual Studio中运行得非常好。

我想我对包含文件的方式做错了,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:0)

想出来。您必须在同一个名称下的一个add_library调用中包含所有.cpp文件。您不需要我原始问题中的额外target_link_libraries。这是完整的文件:

更新:CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib
             SHARED
             src/main/cpp/native-lib.cpp
             src/main/cpp/dog.cpp
             )

find_library(log-lib
              log )

target_link_libraries(native-lib
                       ${log-lib} )

我确信这可以通过仔细阅读文档来回答,但我最后还是阅读了太多不相关的信息。