android - Android中的Native C - 插入其他cpp文件的问题
问题描述
这是我使用 android studio 对 android ndk 的玩具实现。本机 C 模板生成的项目运行良好。还会生成一个 Cmakelists.txt。我知道必须在 cmakelists.txt 下声明自定义库,以便在运行时生成已编译的库。我不确定如何避免为 jni 装饰我的所有 C 函数并简单地生成一个 .so 库,因为它们不会直接从 java 调用。
在示例 native-lib.cpp 中,我尝试插入 foo.cpp 和 foo.h 文件。我假设由于函数Add()
将在 JNI 宏中调用,因此不需要装饰 Add()。如何为这个库生成 .so 文件?
我想稍后导入 4-5 个 cpp 和 hpp 文件,但我不想装饰所有函数,除了将从 android 调用的函数。我正在使用 Android Studio 3.5.3 和最新的 Cmake 和 ndk。
本机 lib.cpp
#include <jni.h>
#include <string>
#include "foo.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testndk1_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
int c = Add(10,100);
std::string hello = "Hello from my C++";
return env->NewStringUTF(hello.c_str());
}
foo.h
int Add(int a, int b);
#include "foo.h"
foo.cpp
int Add(int a, int b) {
return a + b;
}
错误日志:
构建命令失败。错误
在执行进程 D:\Apps\AndroidStudioSDK\cmake\3.10.2.4988404\bin\ninja.exe 时,带有参数 {-C D:\Android_Projects\TestNDK1\app.cxx\cmake\debug\arm64-v8a native-lib} ninja:进入目录
D:\Android_Projects\TestNDK1\app\.cxx\cmake\debug\arm64-v8a' [1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o [2/2] Linking CXX shared library D:\Android_Projects\TestNDK1\app\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so FAILED: D:/Android_Projects/TestNDK1/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so cmd.exe /C "cd . && D:\Apps\AndroidStudioSDK\ndk\21.1.6352462\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android24 --gcc-toolchain=D:/Apps/AndroidStudioSDK/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Apps/AndroidStudioSDK/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++14 -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libnative-lib.so -o D:\Android_Projects\TestNDK1\app\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o -llog -latomic -lm && cd ." CMakeFiles/native-lib.dir/native-lib.cpp.o: In function
Java_com_example_testndk1_MainActivity_stringFromJNI':D:/Android_Projects/TestNDK1/app/src/main/cpp/native-lib.cpp:10:未定义对“Add(int, int)”的引用 clang++:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)忍者:构建停止:子命令失败。
解决方案
在 Cmakelists.txt 下添加以下内容解决了该问题。我不必重新装饰我的功能。
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
foo.cpp
)
推荐阅读
- laravel - 如何 Eloquent 以 hasmanythrough 身份加入
- angular9 - 带有Angular的Nebular,如何从窗口中的组件获取@Output的值
- jenkins - 詹金斯管道:kubectl:未找到
- angular - 从 Angular 中的 PDFTron 导入具有函数的命名空间
- php - 更改 javascript 文件中的硬编码 ID
- node.js - 客户端中的错误对象未显示错误消息
- mysql - SQL 匈牙利语区分大小写
- r - 根据匹配值减去 R 中的行
- python - 我在 python 3.8.3 中遇到导入错误
- permissions - 不同资源组中 Blob 上的数据工厂触发器失败