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

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

詳細はこちら
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++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

Q&A

解決済

1回答

6128閲覧

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

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++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

0グッド

0クリップ

投稿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

1 2class MainActivity : AppCompatActivity() { 3 4 private lateinit var binding: ActivityMainBinding 5 6 companion object { 7 init { 8 System.loadLibrary("C_lib") 9 } 10 } 11 12 13 override fun onCreate(savedInstanceState: Bundle?) { 14 super.onCreate(savedInstanceState) 15 binding = ActivityMainBinding.inflate(layoutInflater) 16 setContentView(binding.root) 17 18 val jt = JniTest() 19 val ret = jt.JniTestFunc(8) 20 println(ret) 21 22 } 23} 24

JniTest.ktファイルです

Java

1 2@SuppressWarnings("JniMissingFunction") 3class JniTest { 4 companion object { 5 init { 6 System.loadLibrary("C_lib") 7 } 8 } 9 10 external fun JniTestFunc(icnt: Int): Int 11} 12

C_lib.cppファイルです。

C++

1 2#include "jni.h" 3#include <cstdio> 4#include <cstring> 5 6int TestFuncAdd(int a, int b) { 7 int add; 8 add = a+ b; 9 return add; 10} 11 12extern "C" JNIEXPORT jint JNICALL 13java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc(JNIEnv* env, jobject thiz, jint jcnt) { 14 jint rc; 15 int iA = jcnt; 16 int iB = 5; 17 18 iB = TestFuncAdd( iA, iB); 19 rc = iB; 20 return rc; 21} 22

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえずC++を試したいのであれば、新規プロジェクトで「Native C++」を選べばよいのでは?と思いますが、まぁそれは置いといて。

cpp

1extern "C" JNIEXPORT jint JNICALL 2Java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc(JNIEnv* env, jobject thiz, jint jcnt) {

C++の関数名は、「java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc」ではなく、「Java_jp_co_mycompany_sampleapp_JniTest_JniTestFunc」(先頭の「J」が大文字)です。

投稿2021/01/22 12:35

katsuko

総合スコア3538

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

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

beginner_kaito

2021/01/25 00:06

回答ありがとうございました! 最初のjavaのjを大文字にしたところ、無事動かすことができました! もっとちゃんとC++勉強します!お手伝い頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問