android - 在 android studio 中创建原生库
问题描述
我已经创建了具有 c++ 支持的 android studio 项目,并安装了本机开发工具包和其他必需的工具。如何导入另一个预构建的本机库以包含在 c++ 代码中。我想做这样的事情
我已经编辑了 cmakelist.txt,如下所示,现在它在 cpp 文件夹下显示共享库。
cmake_minimum_required(VERSION 3.4.1)
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
add_library(lib_gmath STATIC IMPORTED)
set_target_properties(lib_gmath PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gmath/lib/${ANDROID_ABI}/libgmath.a)
add_library(lib_gperf SHARED IMPORTED)
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
add_library(lib_ocr SHARED IMPORTED)
set_target_properties(lib_ocr PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/ocr/lib/${ANDROID_ABI}/libLPROCR.so)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
add_library(hello-libs SHARED
hello-libs.cpp)
target_include_directories(hello-libs PRIVATE
${distribution_DIR}/gmath/include
${distribution_DIR}/gperf/include)
target_link_libraries(hello-libs
android
lib_gmath
lib_gperf
lib_ocr
log)
但我无法在我的 c++ 代码中包含该预建库中的类。
解决方案
我应该在这里提到几件事。
- 我建议切换到
gradle+clang
构建您的代码。Android.mk
不知何故变老了,如果您开始新项目,最好使用更新的构建系统。 - 确保您的预建库可以在 android 中使用。如果不是,则需要先构建它。例如,我自己构建了 openssl,因为我找不到合适的预构建库。
如果您正在使用gradle+cmake
,这里有一个CMakeLists.txt
用于预建库的简单文件:
cmake_minimum_required(VERSION 3.4.1)
add_library( core-api
SHARED
src/main/cpp/mysource.c )
# prebuilt libraries
add_library( crypto-lib
STATIC
IMPORTED )
set_target_properties( crypto-lib
PROPERTIES IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}/../prebuilt/crypto/${ANDROID_ABI}/lib/libcrypto.a )
include_directories( src/main/cpp/
../prebuilt/crypto/common/include/
../prebuilt/crypto/${ANDROID_ABI}/include/ )
# other libraries
find_library( log-lib
log )
target_link_libraries( core-api
crypto-lib
${log-lib} )
这是一个gradle
使用这个的文件CMakeLists.txt
:
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.sdkVersion
defaultConfig {
minSdkVersion 14
targetSdkVersion 27
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static"
cFlags "-D__STDC_FORMAT_MACROS", "-fno-integrated-as"
}
}
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
externalNativeBuild {
cmake {
cFlags "-Wall","-DDEBUG"
}
}
debuggable true
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
推荐阅读
- python - Python以CBC加密方式实现AES
- javascript - 获取匹配区间
- c# - 反序列化 JSON 对象时出错“解析值时遇到意外字符:<。路径 '',第 0 行,位置 0。”
- ruby-on-rails - 如何将 class_name 选项传递给生成器?
- java - java复杂的if语句导致StackOverflowError
- python - 如何在 python 脚本中解析列格式的文本以提供特定的输出
- mysql - 我可以在 MariaDB 10.2.16 LongText 列中使用 Laravel JSON Where 子句吗?
- php - PHP 从 POST 中的表单中获取一个值,该表单具有来自 PHP 脚本的值
- python - Discord.py AttributeError:“上下文”对象没有属性“服务器”
- symfony - Symfony 4,以实体属性作为数组键的 findAll