如何编写native代码,参考谷歌官方文档:
developer.android.com/studio/proj…
按照官方的教程,我编写了cpp代码,并且实现了native方法。 但是允许了之后,报错了:
Process: com.netease.smallsnailread, PID: 1689
java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.netease.smallsnailread.image_uploader.AuthConfig.nosAccessFromJNI(android.content.Context) (tried Java_com_netease_smallsnailread_image_1uploader_AuthConfig_nosAccessFromJNI and Java_com_netease_smallsnailread_image_1uploader_AuthConfig_nosAccessFromJNI__Landroid_content_Context_2)
at com.netease.smallsnailread.image_uploader.AuthConfig.nosAccessFromJNI(Native Method)
at com.netease.smallsnailread.MainActivity.onCreate(MainActivity.kt:73)
at android.app.Activity.performCreate(Activity.java:7963)
at android.app.Activity.performCreate(Activity.java:7952)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3479)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3643)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:100)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2229)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:238)
at android.app.ActivityThread.main(ActivityThread.java:7798)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:512)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
最后发现我的Java端的包名是:
package com.netease.smallsnailread.image_uploader
类名是:
AuthConfig
由于包名里面带有下划线:_ 所以Java或者kotlin的定义应该为:
@JvmStatic
external fun nosAccessFromJNI(context: Context?): String
cpp的方法名定义应该为:
jstring Java_com_netease_smallsnailread_image_uploader_AuthConfig_nosAccessFromJNI(JNIEnv *env,
jobject thiz,
jobject contextObject)
包名的下划线之前加一个 1,用来标记原生代码的包名,本来就带有下划线 至此允许成功。