Android StudioでのJNI使用について。
提供されたライブラリを使用して処理をするアプリを作成中です。
提供されたライブラリは.soファイルでJNIを利用してライブラリを利用する事を考えているのですが上手くいきません。
build.gradle
android { compileSdkVersion 29 buildToolsVersion "29.0.0" defaultConfig { applicationId "jp.xxxx.xxxxx" minSdkVersion 23 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { arguments '-DANDROID_STL=c++_static' } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['../distribution/msxxxxx/lib'] } } externalNativeBuild { cmake { version '3.10.2' path 'src/main/cpp/CMakeLists.txt' } } flavorDimensions 'cpuArch' productFlavors { arm7 { dimension 'cpuArch' ndk { abiFilter 'armeabi-v7a' } } arm8 { dimension 'cpuArch' ndk { abiFilters 'arm64-v8a' } } x86 { dimension 'cpuArch' ndk { abiFilter 'x86' } } x86_64 { dimension 'cpuArch' ndk { abiFilter 'x86_64' } } universal { dimension 'cpuArch' // armeabi-v7a, arm64-v8a, x86, x86_64 } } }
CmakeLists.txt
cmake_minimum_required(VERSION 3.4.1) # configure import libs set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../distribution) # shared lib will also be tucked into APK and sent to target # refer to app/build.gradle, jniLibs section for that purpose. # ${ANDROID_ABI} is handy for our purpose here. Probably this ${ANDROID_ABI} is # the most valuable thing of this sample, the rest are pretty much normal cmake add_library(XXXXX_XXXXX SHARED IMPORTED) set_target_properties(BARCODE_READER PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/msxxxxx/lib/${ANDROID_ABI}/libXXXXX_XXXXX.so) # build application's shared lib set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") add_library(bar-libs SHARED bar-libs.cpp) target_include_directories(bar-libs PRIVATE ${distribution_DIR}/msxxxxx/include) target_link_libraries(bar-libs android XXXXX_XXXXX log)
bar-libs.cpp
#include <jni.h> #include "../../../../distribution/msxxxxx/include/Msxxxxx.h" extern "C" JNIEXPORT jstring JNICALL Java_jp_xxxx_xxxxx_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) { MsBar *pBar = msBar(); return env->NewStringUTF("Hello from JNI LIBS!"); }
Msxxxxx.h
#ifndef __MS_xxxxx_xxxxx_xxx__ #define __MS_xxxxx_xxxxx_H_xxx__ /*********************************************************** * 定数の定義 * ***********************************************************/ //---------------------------------------------------------- // 戻り値 //---------------------------------------------------------- typedef enum _tagMsxxxxxxxxxxBool { brFalse, brTrue } brBool; typedef enum _tagMsxxxxxxxxxxRetCode{ brSuccess, brFail = 0x01000000, brFailBadParam, brFailNotEnoughMemory, brFailNotFoundSymbol, brFailAnalyzeData } brRetCode; /*********************************************************** * 構造体の定義 * ***********************************************************/ typedef struct _tagMsxxxxxxxxxx Msxxxxxxxxxx; /*********************************************************** * 関数の定義 * ***********************************************************/ // インスタンス生成 MsBar *msBar();
Msxxxxx.hはライブラリ提供元から提供されたものです。
上記をビルドするとerror: undefined reference to 'msBar()'となりビルドが出来ませんでした。
libXXXXX_XXXXX.soが読み込めていないのだと思いますが、正常に稼働させるにはどの様にすれば良いのでしょうか?
どなたかご教授下さい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/18 14:10
2019/09/19 03:29