Android JNI-如何从共享库中导入功能

时间:2018-08-13 22:19:58

标签: android java-native-interface reverse-engineering shared-objects

请原谅我绝对缺乏Android JNI

我要分析/调用隐藏在共享库中的一个函数: libEncodeAndDecodeUtils.so

原始代码是这样使用的:

package com.midea.msmartsdk.common.utils;    

public class EncodeAndDecodeUtils {
   public native String esha(String str, String str2, String str3);
}

Ida反编译器显示:

Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha

如何在我的项目中调用此函数?

我当前的尝试:

  1. 具有JNI支持的新AndroidStudio项目
  2. 添加文件夹\ src \ main \ jniLibs \ armeabi-v7a
  3. 将libEncodeAndDecodeUtils.so复制到armeabi-v7a
  4. buid.bradle android {defaultConfig {ndk {abiFilters“ armeabi-v7a”}}
  5. 并创建课程

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);
}

这导致我出错:

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)

这是我的问题吗?

  

Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha   !=   Java_com_midea_msmartsdk_common_utils_so_1test4_EncodeAndDecodeUtils_esha

1 个答案:

答案 0 :(得分:1)

如果您尝试通过自己的代码访问esha,则必须声明此方法与其原始形式完全相同,因为JNI会尝试按照以下方法找到实现固定约定。根据{{​​3}}

  

解析本机方法名称

     

动态链接器根据其名称解析条目。本机方法名称由以下组件连接而成:

     
      
  • 前缀Java_
  •   
  • 完整的类名
  •   
  • 下划线(_)分隔符
  •   
  • 重载的本地方法的错误方法名称,
  •   
  • 两个下划线(__),后跟经过修饰的参数签名
  •   

简单来说,它将类似于Java_packagename_ClassName_methodsignature

例如,在您的情况下为Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha

因此,请尝试从包名称中删除so_test4