【问题标题】:Android JNI undefined reference to error c++ methodsAndroid JNI 未定义对错误 c++ 方法的引用
【发布时间】:2019-07-11 10:49:50
【问题描述】:

我正在尝试使用 Android JNI 从 AVS SDK 调用方法。 源代码是 C++。 但是在构建 apk 时,我遇到了以下错误。

FAILURE: Build failed with an exception.

What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
Build command failed.
Error while executing process /home/useradm/Androidsdk/cmake/3.10.2.4988404/bin/cmake with arguments {--build /root/AndroidStudioProjects/alexaProtoApp/app/.externalNativeBuild/cmake/debug/x86 --target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o
[2/2] Linking CXX shared library /root/AndroidStudioProjects/alexaProtoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
FAILED: /root/AndroidStudioProjects/alexaProtoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so 
: && /home/useradm/Androidsdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=i686-none-linux-android24 --gcc-toolchain=/home/useradm/Androidsdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/useradm/Androidsdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libnative-lib.so -o /root/AndroidStudioProjects/alexaProtoApp/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o  /root/AndroidStudioProjects/alexaProtoApp/app/src/main/cpp/../../main/jniLibs/x86/libSampleApp.so /home/useradm/Androidsdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/24/liblog.so /home/useradm/Androidsdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/24/liblog.so -latomic -lm && :
/root/AndroidStudioProjects/alexaProtoApp/app/src/main/cpp/native-lib.cpp:25: error: undefined reference to 'my_initialize(_JavaVM*, _jobject*)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

这是我的

native-lib.cpp

#include <jni.h>
#include <ostream>
#include "custom_main.h"
#include <android/log.h>

JavaVM *my_jvm;
jobject activity;

extern "C"
JNIEXPORT jint JNICALL
Java_myapp_avs_activities_MainActivity_initialize(JNIEnv *env, jobject instance) {

activity = env->NewGlobalRef(instance);
return my_initialize(my_jvm, activity);


}extern "C"
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *aReserved) {

my_jvm = vm;
if (vm != NULL)
    __android_log_print(ANDROID_LOG_INFO, "AVSapp", "Assigned");
return JNI_VERSION_1_6;

}extern "C"
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) {
   __android_log_print(ANDROID_LOG_INFO, "AVSapp", "OnUnload");
}

custom_main.h

#ifndef CUSTOM_MAIN_H
#define CUSTOM_MAIN_H
#include "jni.h"

int my_initialize(JavaVM *, jobject);

#endif

ma​​in.cpp

#include "custom_main.h"
int my_initialize(JavaVM* myJavaVM, jobject instance) {

}

注意:由于限制,我无法共享完整代码,因此共享 sn-p。

我的问题是,这个链接器相关问题吗? , 请指导我解决这个问题。

【问题讨论】:

  • 我看到你使用native-lib.cpp 构建,但不是使用main.cpp。您需要将其添加到您的项目或构建系统中。
  • native-lib.cpp 驻留在我的 Android 项目中。 main.cpp 驻留在我在我的 android 项目中实现的 sdk 中。我的 cmake 列表和其他文件已正确写入。 main.cpp 中还有其他方法(我没有在这里显示)没有未定义的引用错误,但只有这个方法得到了错误。
  • 也许您应该将my_initialize 函数放在一个单独的源文件中,以便两个项目都可以使用?
  • 我已经在我的android项目中复制了头文件,并且还包含在 native-lib.cpp 中,以便我可以获得该方法的参考。我还根据平台复制了jniLibs文件夹中的so文件。
  • #include "custom_main.h" 添加到main.cpp

标签: android c++ cmake android-ndk java-native-interface


【解决方案1】:

在 custom_main.h 中使用 extern c,它会起作用

#ifdef __cplusplus
extern "C" {
#endif

#ifndef CUSTOM_MAIN_H
#define CUSTOM_MAIN_H
#include "jni.h"

int my_initialize(JavaVM *, jobject);

#endif

#ifdef __cplusplus
}
#endif

Build->刷新链接的 c++ 项目并再次重建您的项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多