首页 > 解决方案 > 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 查看调用)忍者:构建停止:子命令失败。

标签: androidandroid-studioandroid-ndk

解决方案


在 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
        )

推荐阅读