Please Excuse my absolute lack of Android JNI
I want to analize/call one function hidden in shared object: libEncodeAndDecodeUtils.so
orginal code uses it like this:
package com.midea.msmartsdk.common.utils;
public class EncodeAndDecodeUtils {
public native String esha(String str, String str2, String str3);
}
Ida decompiler shows:
Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha
My current attempt:
package com.midea.msmartsdk.common.utils.so_test4;
public class EncodeAndDecodeUtils {
static {
System.loadLibrary("EncodeAndDecodeUtils");
}
public native String esha(String str, String str2, String str3);
}
this lead me to error:
E/zygote: No implementation found for java.lang.String com.midea.msmartsdk.common.utils.so_test4.EncodeAndDecodeUtils.esha (java.lang.String, java.lang.String, java.lang.String) (tried Java_com_midea_msmartsdk_common_utils_so_1test4_EncodeAndDecodeUtils_esha and Java_com_midea_msmartsdk_common_utils_so_1test4_EncodeAndDecodeUtils_esha__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2)
is this my problem?
Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha != Java_com_midea_msmartsdk_common_utils_so_1test4_EncodeAndDecodeUtils_esha
If you try to access esha
from your own code, then you HAVE TO declare this method exactly the same as its original form, because JNI will try to find the implementation following some fixed convention. According to https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/design.html
Resolving Native Method Names
Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components:
- the prefix Java_
- a mangled fully-qualified class name
- an underscore (“_”) separator
- a mangled method name for overloaded native methods,
- two underscores (“__”) followed by the mangled argument signature
Simply speaking, it will be something like Java_packagename_ClassName_methodsignature
.
For example, in your case, it is Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha
.
So, try to remove so_test4
from your package name.