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

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

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

JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android NDK

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

解決済

AndroidStudioでC++のコードを呼び出したいがjava.lang.UnsatisfiedLinkErrorと出る

beginner_kaito
beginner_kaito

総合スコア16

JNI

JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android NDK

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

1回答

0リアクション

0クリップ

3196閲覧

投稿2021/01/22 08:33

編集2021/01/22 08:53

KotlinでのAndroidアプリ開発経験はそこそこある開発初心者です。
アプリ開発でCやC++のライブラリを使いたいなと思う場面があったので、Kotlinのコード内でC++で書かれた処理を使えるようにしたいと考えております。
現時点では、C++の知識はほぼない状態です。
https://syoshinsya.mydns.jp/syosinsya/TryAndroidNDK.html
こちらのページを参考に、JNI関数用のプログラムを書く、というところまで行ったのですが、以下のようなエラーが出てきました。

E/AndroidRuntime: FATAL EXCEPTION: main Process: jp.co.mycompany.sampleapp, PID: 3635 java.lang.UnsatisfiedLinkError: No implementation found for int jp.co.myconpany.sampleapp.JniTest.JniTestFunc(int) (tried Java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc and Java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc__I) at jp.co.mycompany.sampleapp.JniTest.JniTestFunc(Native Method) at jp.co.mycompany.sampleapp.MainActivity.onCreate(MainActivity.kt:24) at android.app.Activity.performCreate(Activity.java:7825) at android.app.Activity.performCreate(Activity.java:7814) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Kotlinで書いたMainActivityクラスでは以下のように書いております。

Kotlin

class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding companion object { init { System.loadLibrary("C_lib") } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val jt = JniTest() val ret = jt.JniTestFunc(8) println(ret) } }

JniTest.ktファイルです

Java

@SuppressWarnings("JniMissingFunction") class JniTest { companion object { init { System.loadLibrary("C_lib") } } external fun JniTestFunc(icnt: Int): Int }

C_lib.cppファイルです。

C++

#include "jni.h" #include <cstdio> #include <cstring> int TestFuncAdd(int a, int b) { int add; add = a+ b; return add; } extern "C" JNIEXPORT jint JNICALL java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc(JNIEnv* env, jobject thiz, jint jcnt) { jint rc; int iA = jcnt; int iB = 5; iB = TestFuncAdd( iA, iB); rc = iB; return rc; }

これから勉強していこうとは思っていますが、正直現時点でC++などについての理解は二の次になっている自覚はあります。
しかし、一応上記リンクの記事を追って書いているので、何かしら結果は出ると思っていました。
しかし結果はエラーです。
このようなエラーが出る要因としてはどのようなことが考えられるでしょうか。
先走っている未熟者に、どうか参考になる知見をご教示頂けたら幸いです。宜しくお願い致します。

以下が開発環境となっております。
OS Windows 10
Android Studio バージョン4.1.1
Kotlin 1.4.21

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JNI

JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android NDK

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