首页 > 解决方案 > Android JNI - 如何从共享对象导入函数

问题描述

请原谅我绝对缺乏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

标签: androidjava-native-interfacereverse-engineeringshared-objects

解决方案


如果你尝试esha从你自己的代码中访问,那么你必须声明这个方法与其原始形式完全相同,因为 JNI 将尝试按照一些固定的约定来查找实现根据https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/design.html

解析本机方法名称

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

  • 前缀 Java_
  • 损坏的完全限定的类名
  • 下划线 (“_”) 分隔符
  • 重载本机方法的损坏方法名称,
  • 两个下划线(“__”)后跟错误的参数签名

简而言之,它将类似于Java_packagename_ClassName_methodsignature.

例如,在您的情况下,它是Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha.

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


推荐阅读