Android JNI 未定义对错误 c++ 方法的引用
Android JNI undefined reference to error c++ methods
我正在尝试使用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.
这是我的
原生库.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
主.cpp
#include "custom_main.h"
int my_initialize(JavaVM* myJavaVM, jobject instance) {
}
注意:由于限制,我无法共享完整的代码,因此共享片段。
我的问题是,这个链接器相关的问题吗?,请指导我解决这个问题。
在 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
生成->刷新链接的 C++ 项目,然后再次重新生成项目
相关文章:
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么常量方法可以采用非常量引用?
- 没有取消引用/解包对象的标准方法?
- C++方法中的引用变量
- 引用文件的适当方法是什么?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 对结构方法的未定义引用
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 使用移动语义:右值引用作为方法参数
- 引用基类模板的成员变量的简单方法
- 如何继承返回对当前对象的引用的方法?
- 对使用 CMake 生成为 lib .a 的方法的未定义引用
- 对纯抽象类中方法的未定义引用
- C++ 和 WMI:在 IWbemClassObject::P ut 方法中传递对 CIM 类的引用
- 对象引用中的字段以不同的方法返回不同的值
- 具有引用返回类型的重写方法上的协变返回类型无效
- c++,g2o(Graph-Framework),qcreator,未定义的方法引用
- 由于未定义QSerialPortInfo方法引用,无法编译