Android JNI 报错,java.lang.UnsatisfiedLinkError

829 阅读1分钟

如何编写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)

image.png

最后发现我的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,用来标记原生代码的包名,本来就带有下划线 至此允许成功。