我正在使用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中运行得非常好。
我想我对包含文件的方式做错了,但我无法弄清楚它是什么。
答案 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} )
我确信这可以通过仔细阅读文档来回答,但我最后还是阅读了太多不相关的信息。