Файл, который у меня есть в 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 за помощь и время!