2017-11-07 7 views
0

私は.aar個のAndroidモジュールを生成するためにAndroidスタジオと連携しています。 Javaクラスとメソッドを公開して他のプロジェクトで呼び出すことができます。生成されたスタティック/共有ライブラリをバンドルします。

これらのメソッドの1つは、静的ライブラリで定義され、JNIを通じてJavaから呼び出される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には表示されません。

+0

(limmodule /構築/出力/ AARに)AAR FILAに共有ライブラリを構築し、バンドルに、それはGradleのを実行するのに十分だ** bundleRelease **タスク(または** bundleDebugは**お望みならば)。しかし、これは静的ライブラリでは機能しません。 –

+1

ありがとう、私は明日見てみましょう! – Nepho

+0

@AlexCohn:私はそれを試しましたが、生成された '.aar'は、ビルドプロセス中に生成されていても何らかの理由でライブラリを含んでいません。私は実際にそれを説明することはできません...私は私のマニュアルビルディングスクリプトソリューションに固執すると思います – Nepho

答えて

0

でディレクトリLIBSを設定する必要があります終わり。 .aarファイルを「解凍」し、Android Studioでコンパイルされた静的/共有ライブラリを追加して編集し、.aarファイルに「re-zips」します。ここでのスクリプトは次のとおりです。

#! /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/ 
0

あなたは、私がどんな「ビルトイン」解決策を見つけることができませんでしたので、私は非常に呼ばれ、私のビルドプロセスにスクリプトを追加build.gradle

android { 
    ... 
    main { 
     jniLibs.srcDirs = [ 'jni/libs', 'externalNativeBuild/cmake/release/${ARCH}/libs/${ARCH}' ] // Where generated .so files are placed. 
     ... 
    } 
    } 
+0

ありがとう、私はそれを試してみましょう – Nepho

+0

私はこれを 'build.gradle'に追加しましたが、それは何の違いもないと思います。 '.aar'を生成すると' .aar'を生成する場合とそうでない場合の両方で同じサイズのファイルが生成されます... – Nepho

+0

私は 'jni.srcDirs = []'を同じセクションに入れます。 bashスクリプト – Geoffrey

関連する問題