我正在与Android合作生成.aar安卓模块。它允许我公开Java类和方法,以便在其他项目中调用它们。
其中一个方法是在静态库中定义并通过Java通过JNI调用的C++方法。
当导入.aar并试图调用这样的方法时,我会遇到一个“未定义的引用”。解压缩.aar并对其进行搜索表明,它不包含通过使用Cmake的Android生成的静态/共享库的任何痕迹。
我该怎么补救呢?
生成库的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.4.1)
set(GCC_COVERAGE_LINK_FLAGS "--whole-archive")
# Find the android-log library for debug purposes
find_library(log-lib log)
# Set directory variables
set(LIBS_DIR ${CMAKE_SOURCE_DIR}/libs)
set(SRC_DIR ${CMAKE_SOURCE_DIR})
# Compiles the static transaction library from sources
add_library(code-logic
STATIC
${SRC_DIR}/src/CustomAPI.cpp
${SRC_DIR}/src/ParameterAPI.cpp )
include_directories(${SRC_DIR}/inc/)
# Compiled native-lib from native cpp source code
add_library(native-lib SHARED src/main/cpp/native-lib.cpp)
# Link it with android-log and transaction-logic
target_link_libraries(native-lib
code-logic
log )我可以看到,库确实是在ProjectDirectory/app/.externalNativeBuild/cmake/release/${ARCH}/libs/${ARCH}/lib.so中生成的,但它们没有出现在intermediates/文件夹中或生成的.aar中的任何地方。
发布于 2017-11-08 13:38:09
我找不到任何“内置”解决方案,所以我在构建过程中添加了一个脚本,这个脚本在最后被调用。它“解压缩”.aar文件,通过添加由Android编译的静态/共享库来编辑它,然后将它“重新压缩”到一个.aar文件中。下面是脚本:
#! /usr/bin/env /bin/bash
OUT_DIR=`pwd`
LIB_DIR="${OUT_DIR}/tmp/libs"
JNI_DIR="${OUT_DIR}/tmp/jni"
BASE_DIR="${OUT_DIR}/.."
PROJ_NAME="PROJECT_NAME_BASE_DIRECTORY"
LIB_NAME="LIB_NAME.aar"
BUILD_DIR="${BASE_DIR}/${PROJ_NAME}/app/.externalNativeBuild/cmake/release"
rm -rf ./tmp/ && mkdir ./tmp/
unzip ${LIB_NAME} -d ./tmp/
(
cd "${BUILD_DIR}" \
&& for f in `find . -name "*\.a"`
do
mkdir -p "${JNI_DIR}/"$(basename $(dirname "${f}"));
cp "${f}" "${JNI_DIR}"/$(basename $(dirname "${f}"));
done \
&& for f in `find . -name "*\.so"`
do
mkdir -p "${JNI_DIR}/"$(basename $(dirname "${f}"));
cp "${f}" "${JNI_DIR}"/$(basename $(dirname "${f}"));
done
)
rm -f ${LIB_NAME}.aar
jar cvf ${LIB_NAME}.aar -C ./tmp/ .
rm -rf ./tmp/发布于 2017-11-08 09:26:55
您可能必须在build.gradle中设置libs dir
android {
...
main {
jniLibs.srcDirs = [ 'jni/libs', 'externalNativeBuild/cmake/release/${ARCH}/libs/${ARCH}' ] // Where generated .so files are placed.
...
}
}https://stackoverflow.com/questions/47163110
复制相似问题