java.lang.UnsatisfiedLinkError: Реализация не найдена (NDK, Kotlin) - Исправлено - PullRequest
0 голосов
/ 26 декабря 2018

Файл, который у меня есть в C с использованием NDK, следующий: я проверил имя пакета в Kotlin и имя класса C (NDK), и я не вижу никакой разницы:

 jstring Java_com_test1_app1_ui_BaseActivity_getLocalKeyOld(JNIEnv* env, jobject obj, jstring id) {
    const char *nativeString = (*env)->GetStringUTFChars(env, id, 0);

    char* deviceIdEncode = base64encode(nativeString);
    int lenght = strlen(deviceIdEncode);

    jstring result;
    if(lenght < 16) {
        result = (*env)->NewStringUTF(env,"+-0wef2ccfeqa0-+");
    } else if(lenght > 16) {
        char subbuff[17];
        memcpy( subbuff, &deviceIdEncode[0], 16 );
        subbuff[16] = '\0';
        result = (*env)->NewStringUTF(env,subbuff);
    } else {
        result = (*env)->NewStringUTF(env,deviceIdEncode);
    }
    return result;
}


jstring Java_com_test1_app1_ui_BaseActivity_getLocalKey(JNIEnv* env, jobject obj, jstring id) {
    const char *nativeString = (*env)->GetStringUTFChars(env, id, 0);

    char* deviceIdEncode = base64encodeNew(nativeString);
    int lenght = strlen(deviceIdEncode);

    jstring result;
    if(lenght < 16) {
        result = (*env)->NewStringUTF(env,"+-0wef2ccfeqa0-+");
    } else if(lenght > 16) {
        char subbuff[17];
        memcpy( subbuff, &deviceIdEncode[0], 16 );
        subbuff[16] = '\0';
        result = (*env)->NewStringUTF(env,subbuff);
    } else {
        result = (*env)->NewStringUTF(env,deviceIdEncode);
    }
    return result;
}

Мой пакет классов Kotlin - это пакет com.test1.app1.ui

Я загружаю библиотеку lib, используя следующие строки:

abstract class BaseActivity : AppCompatActivity() {

    companion object {
        @JvmStatic
        external fun getLocalKey(id: String): String

        @JvmStatic
        external fun getLocalKeyOld(id: String): String
    }

Я использую NDK и Kotlin,Приложение запускается хорошо, но когда я помещаю его в фоновый режим, открываю другие приложения и пытаюсь зайти в мое приложение, оно вылетаетЯ могу получить только следующую информацию:

E/zygote: No implementation found for java.lang.String com.test1.app1.ui.BaseActivity.getLocalKey(java.lang.String) 
    (tried Java_com_test1_app1_ui_BaseActivity_getLocalKey and Java_com_test1_app1_ui_BaseActivity_getLocalKey__Ljava_lang_String_2)




    Process: com.testLab.app1, PID: 31409
        java.lang.UnsatisfiedLinkError: No implementation found 
        for java.lang.String com.test1.app1.ui.BaseActivity.getLocalKey(java.lang.String) (tried Java_com_test1_app1_ui_BaseActivity_getLocalKey and Java_com_test1_app1_ui_BaseActivity_getLocalKey__Ljava_lang_String_2)
            at com_test1_app1_ui_BaseActivity.getLocalKey(Native Method)
            at com.test1.app1.ui.BaseActivity$Companion.getLocalKey(BaseActivity.kt:1)
            at com.test1.app1.services.Utils.decryptLocal(Utils.kt:620)
            at com.test1.app1.services.Utils.getUserPhone(Utils.kt:352)
            at com.test1.app1.ui.login.LoginActivity.initActivity(LoginActivity.kt:77)
            at com.test1.app1.ui.login.WelcomeActivity.onCreate(WelcomeActivity.kt:24)
            at android.app.Activity.performCreate(Activity.java:7032)
            at android.app.Activity.performCreate(Activity.java:7023)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1236)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943)
            at android.app.ActivityThread.-wrap11(Unknown Source:0)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:164)
            at android.app.ActivityThread.main(ActivityThread.java:6626)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

FIX (это сработало для меня)

Я уведомляю, что вызывал System.loadLibrary ("nameofyourCFile")в SplashActivity (SplashActivity расширяет BaseActivity), но остальные действия не загружают файл C, потому что, когда я собирался в фоновый режим и возвращался, SplashActivity снова не запускался, поэтому моя библиотека не загружалась откуда-либо.Я поместил System.loadLibrary () внутри моей BaseActivity, и она работает!

PS Спасибо, мистер @ GenoChen за помощь и время!

1 Ответ

0 голосов
/ 26 декабря 2018

A System.loadLibrary() (возможно, внутри блока init {} в блоке companion object {}) необходимо, чтобы среда выполнения Java могла найти, где находится нативная библиотека (которая содержит «ядро» функции).Просто @JvmStatic external fun (который является просто "поверхностью" или "интерфейсом") недостаточно.

Если вы вызвали эти внешние функции до загрузки этой библиотеки, вы получите такойисключение.

Возможно, правильный путь (прямое копирование из шаблона нового проекта Android Studio):

class MainActivity : Activity()
{

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Example of a call to a native method
        sample_text.text = stringFromJNI()
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    external fun stringFromJNI(): String

    companion object
    {

        // Used to load the 'native-lib' library on application startup.
        init
        {
            System.loadLibrary("native-lib")
        }
    }
}

Перемещение external fun внутри companion object {}, как в оригинальном вопросе, в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...