🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android NDK

Android NDKとは、Android SDKと対を成すツールです。ネイティブコードのアプリ、またはC/C++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

Q&A

1回答

1044閲覧

Android JNIについて

WestField

総合スコア18

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android NDK

Android NDKとは、Android SDKと対を成すツールです。ネイティブコードのアプリ、またはC/C++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

0グッド

0クリップ

投稿2019/09/14 14:58

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が読み込めていないのだと思いますが、正常に稼働させるにはどの様にすれば良いのでしょうか?

どなたかご教授下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ご提示のCMakeLists.txtにおいて、

add_library(XXXXX_XXXXX SHARED IMPORTED) set_target_properties(BARCODE_READER PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/msxxxxx/lib/${ANDROID_ABI}/libXXXXX_XXXXX.so)

XXXXX_XXXXXBARCODE_READER で名称が異なっています。揃えてみてください。

投稿2019/09/18 02:24

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WestField

2019/09/18 14:10

ご回答有難う御座います。 確かに違っておりました。ただ、私の質問する際の変換ミスでしたので、本来は揃っております。 意外な所に落とし穴があり、libXXXXX_XXXXX.soはCでコンパイルされたものでした。 コンパイルの違いからエラーが発生していたようです。 結局のところヘッダをincludeする際にextern "C"で囲む事で解決できました。 有難う御座いました。
kakajika

2019/09/19 03:29

そうだったのですね。解決されたなら何よりです。 そうしましたら、今後このページを見る人のためにも、解決方法について投稿して自己解決としてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問