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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/25 00:06