Search code examples
androidjava-native-interfacereverse-engineeringshared-objects

Android JNI - how to import function from shared object


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

How can I call this function in my project?

My current attempt:

  1. new AndroidStudio project with JNI support
  2. adding folder \src\main\jniLibs\armeabi-v7a
  3. copy libEncodeAndDecodeUtils.so to armeabi-v7a
  4. buid.bradle android{ defaultConfig { ndk {abiFilters "armeabi-v7a"} }
  5. and creating class

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


Solution

  • 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.