当前位置: 首页 > 知识库问答 >
问题:

Android NDK JNI构建错误:未定义对“function_name”的引用

茅和玉
2023-03-14

我有一个简单的Android NDK代码与JNI。不幸的是,由于错误,它无法生成:

error: undefined reference to 'get_hello()' 

我已经检查了其他带有相同错误的Stackoverflow问题。但没有一个与我的文件结构相似。

├── app
│   └── src
│       ├── main
│       │   ├── AndroidManifest.xml
│       │   ├── cpp
│       │   │   ├── CMakeLists.txt
│       │   │   ├── native-lib.cpp
│       │   │   ├── my_hello
│       │   │   │   ├── hello.c
│       │   │   │   └── hello.h
│       │   │   └── your_hello
│       │   │       ├── hihi.c
│       │   │       └── hihi.h
│       │   ├── java
│       │   │   └── com
│       │   │       └── example
│       │   │           └── myapplication
│       │   │               └── MainActivity.java
cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib
             SHARED
             native-lib.cpp )

add_library( hello-lib
             STATIC
             my_hello/hello.c )

add_library( hihi-lib
             STATIC
             your_hello/hihi.c )

include_directories( my_hello/ )
include_directories( your_hello/ )

find_library( log-lib
              log )

target_link_libraries( hihi-lib
                       hello-lib
                       native-lib

                       ${log-lib} )
#include <jni.h>

#include "my_hello/hello.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {

    return env->NewStringUTF(get_hello());
}
#ifndef MY_APPLICATION_HELLO_H
#define MY_APPLICATION_HELLO_H

const char *get_hello();

#endif //MY_APPLICATION_HELLO_H
#include "hello.h"
#include "../your_hello/hihi.h"

const char *get_hello() {
    return get_your_hello();
}
#ifndef MY_APPLICATION_HIHI_H
#define MY_APPLICATION_HIHI_H

const char* get_your_hello();

#endif //MY_APPLICATION_HIHI_H
#include "hihi.h"

const char* get_your_hello() {
    return "your hello";
}
> Task :app:externalNativeBuildDebug FAILED
Build native-lib_armeabi-v7a
ninja: Entering directory `/home/myname/AndroidStudioProjects/MyApplication/app/.cxx/cmake/debug/armeabi-v7a'
[1/1] Linking CXX shared library /home/myname/AndroidStudioProjects/MyApplication/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so
FAILED: /home/myname/AndroidStudioProjects/MyApplication/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so 
: && /home/myname/Android/Sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --gcc-toolchain=/home/myname/Android/Sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/myname/Android/Sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security   -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,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libnative-lib.so -o /home/myname/AndroidStudioProjects/MyApplication/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o  -latomic -lm && :
/home/myname/AndroidStudioProjects/MyApplication/app/src/main/cpp/native-lib.cpp:10: error: undefined reference to 'get_hello()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

共有1个答案

嵇财
2023-03-14

您的native-lib库在链接过程中失败,因为您没有告诉它在哪里可以找到get_hello()的定义。您需要将包含get_hello()定义的库链接到native-lib库。

您的代码有这样一行:

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

它将所有其他库链接到hihi-lib库。这可能不是你打算做的。

# Link hihi-lib to hello-lib.
target_link_libraries( hello-lib PUBLIC hihi-lib )

# Link hello-lib (and others) to native-lib, hihi-lib will be propagated via hello-lib.
target_link_libraries( native-lib PRIVATE hello-lib ${log-lib} )
 类似资料:
  • 问题内容: 我在使用C ++(Eclipse)的Linux中工作,并且想要使用一个库。Eclipse显示了一个错误: 你知道解决方案吗? 这是我的代码: 问题答案: 您必须针对libdl进行链接,添加 -ldl 到您的链接器选项

  • 我想用get方法获取有关邮递员的信息。但每当我“localhost:3000/api/mekanlar/mekan的objectid”时,我就会得到引用错误“mekan未定义”。这是我的mekansema。/app\u api/models中的js文件。 还有mekanlar。/app\u api/controllers中的js文件 这是索引。js in/app\U api/routes。

  • 问题内容: 我对Ubuntu相当陌生,但似乎无法使它正常工作。它可以在我的学校计算机上正常工作,我不知道自己在做什么。我检查了 usr / include 和time.h就好了。这是代码: 我正在使用CodeBlocks作为我的IDE来进行构建和运行。任何帮助都会很棒,谢谢。 问题答案: 添加到g ++命令行的末尾。该链接在librt.so“实时”共享库中。

  • 这是我的HTML代码,我试图将div中输出的内容转换成可下载的pdf文件。 我在控制台上得到这个错误: “未捕获引用错误:未定义jsPDF” 我不确定我做错了什么,我甚至在脚本标签中添加了。。。

  • 我想知道有没有人能帮我解决这个问题--我才刚接触C++,它给我带来了很多麻烦。 我正在尝试制作相对简单的套牌和卡类对象。 错误出现在“deck.cpp”中,它声明了一个卡片数组,然后我尝试用卡片对象填充数组。它说有对、和的未定义引用。 卡d.h Card.cpp

  • 我第一次与Firebase合作进行一个实践项目,我很难设置用户登录其帐户的能力。 我已成功设置注册,但到目前为止,我无法登录并检查身份验证状态是否正常工作。 我在控制台中不断收到的错误是“未捕获引用错误:未定义Firebase” 我自己做了一些研究,但我似乎找到的唯一答案是,你需要包含Firebase的脚本标签,这在这里不相关,因为我已经包含了它们,或者2.4.2版本的过时响应 有关守则如下: