如何在jni中链接预构建
how to link prebuild so in jni
我创建了一个头文件"abc.h",声明
int abc();
然后,我创建了一个.cpp文件"abc.cpp",定义为
int abc()
{
return 10;
}
现在我创建了一个库libabc。
我已经创建了一个HelloWorld Android项目。然后,我在jni中创建了一个lib文件夹,并将libabc。
现在我在jni文件夹中创建了另一个文件"xyz.cpp",想要使用abc()
函数。但是当我运行ndk-build
命令时,我得到这个错误。Error: undefined reference to function abc
.
这是xyz.cpp文件。 Android。 Android。 如何解决这个错误int getAbcFunction()
{
int value = abc();
// return value;
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := abc-prebuild
LOCAL_SRC_FILES := libabc.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := xyz.cpp
LOCAL_SHARED_LIBRARIES := abc-prebuild
include $(BUILD_SHARED_LIBRARY)
将#include "abc.h"
添加到xyz.cpp的开头
如果你使用的是Android Studio,默认情况下你的makefile文件会被忽略,因为所有的配置都是使用gradle或gradle-experimental插件进行的。
然而,这些工具还不支持本地预构建,因此您应该停用默认支持并自己调用ndk-build:
android.sources{
main.jni {
source {
srcDirs 'src/main/none' //deactivate built-in compilation
}
}
main.jniLibs {
source {
srcDir 'src/main/libs' //integrate .so files from src/main/libs
}
}
}
顺便说一句,这与你的问题并不完全相关,但你有:
LOCAL_SRC_FILES := libabc.so
这意味着你打算对NDK支持的所有架构(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64)使用这个预构建(armeabi?),即使它们不兼容。你应该做
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libabc.so
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 如何在构建链接列表时调整头、尾指针
- 在树莓派上用libtorch构建程序时的链接问题
- 未知的 GCC 链接器错误,但已成功构建
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 链接两个使用 c++ 构建的库_static
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 如何在Windows上链接动态构建的cmake文件
- 使用cmake构建google测试单元测试时出现链接器错误
- 使用 gcc 6 构建 OpenJDK8 时出现链接错误
- 如何在bazel中使用make规则链接库构建
- 使用 pybind11 构建库,链接其他共享库
- 使用 VS2017 构建 OpenSSL 后出现一些链接错误。 " OPENSSL_init_ssl referenced in function _main " ?
- 当我分离编译和链接时,代码不构建
- 尝试使用 gradle 构建指向静态库的 c++ 项目链接时找不到头文件
- Vscode C++调试使用 cl.exe 和 / 链接构建的代码.exe - 调试器不附加
- dev - c++中Boost链接/构建的问题
- 外部链接是否增加了链接/构建时间