質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

12636閲覧

Android StudioでC言語のプログラムを読み込む

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/05/10 02:34

Android StudioでC言語のライブラリをインポートしたく、サンプルを作って試していますが、コンパイル時にUnsatisfiedLinkErrorが出ます。

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.example.sampleApp.MainActivity.stringFromJNI() (tried Java_com_example_sampleApp_MainActivity_stringFromJNI and Java_com_example_sampleApp_MainActivity_stringFromJNI__)

MainActivity.javaの中身は以下のように書きました。

static { System.loadLibrary("hello"); } public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); tv.setText(stringFromJNI()); setContentView(tv); }

Android.mkは以下のように書きました。

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)

C言語を書いたhello-jni.cはこんな感じです。

jstring Java_com_example_sampleApp_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz ) { #if defined(__arm__) #if defined(__ARM_ARCH_7A__) #if defined(__ARM_NEON__) #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a/NEON (hard-float)" #else #define ABI "armeabi-v7a/NEON" #endif #else #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a (hard-float)" #else #define ABI "armeabi-v7a" #endif #endif #else #define ABI "armeabi" #endif #elif defined(__i386__) #define ABI "x86" #elif defined(__x86_64__) #define ABI "x86_64" #elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ #define ABI "mips64" #elif defined(__mips__) #define ABI "mips" #elif defined(__aarch64__) #define ABI "arm64-v8a" #else #define ABI "unknown" #endif return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); }

どのようにすれば、Android StudioでC言語のライブラリを使えるようになるでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

自分はAndroidStudioを使わず、いつもgradlewスクリプトでビルドしていて、AndroidStudioでJNIを使ったことはないので、あしからず。

「Android.mk」とか言っている事から、eclipseでの情報を参考にしていませんか。
eclipseとはビルドシステムが別なので、当てにしてはいけません。

AndroidStudioでNDKを使う場合には、android gradle-experimental pluginを使うようです。

他にも、「AndroidStudio NDK」とか「AndroidStudio JNI」とかでググると情報が出てきますが、ひとつだけ注意点。
gradle-experimental-pluginは、「experimental(実験的)」なので、バージョンが変わると仕様もガラッと変わっていて、gradleファイルの書き方も違っています。
そのため、かなり最近のブログの記事でも、現在のバージョンとは違う内容の場合もあります。
まぁ、上記の公式サイトにかなりバッチリ説明が書かれているので、それだけで十分だと思いますが。

もちろん、「eclipseを使う」というのも、一つの手です。

投稿2016/05/10 14:48

編集2016/05/10 14:51
katsuko

総合スコア3469

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

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

退会済みユーザー

退会済みユーザー

2016/05/11 05:46

ありがとうございます。Android.mkはEclipseの場合に使うものだったのですね。そこが理解できてなかったです。
guest

0

Jniはあまり触ってないので間違っているかもしれませんが、
マングリングが関係しているかもしれないです。
なんかextern "C"とかJNIEXPORTとか書くあれです。

追記:5/11
質問の内容を少し勘違いしていました。
AndroidStudioでNDKのビルドすることは、
今のところは出来ないと考えたほうがよいです。

ndk-buildで生成した共有ライブラリ(soファイル)を
読み込ませること自体はAndroidStudioでも出来ます。
その場合のsoファイルの配置場所はデフォルトで以下の場所です。
(プロジェクトルート)\(モジュール)\src\main\jniLibs
この下に、アーキテクチャ毎のディレクトリを作成し、soファイルを配置してください。

投稿2016/05/10 03:13

編集2016/05/11 01:48
abs123

総合スコア1280

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

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

退会済みユーザー

退会済みユーザー

2016/05/10 12:55

ありがとうございます。調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問