Android JNI - 如何从共享对象导入函数

Android JNI - how to import function from shared object

请原谅我绝对缺乏Android JNI

我想 analize/call 一个函数隐藏在共享对象中: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. 新Android具有 JNI 支持的 Studio 项目
  2. 添加文件夹\src\main\jniLibs\armeabi-v7a
  3. 复制libEncodeAndDecodeUtils.so到armeabi-v7a
  4. buid.bradle android{ defaultConfig { ndk {abiFilters "armeabi-v7a"} }
  5. 并创建 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);
}

这导致我出错:

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

如果您尝试从您自己的代码访问 esha,那么您必须声明此方法与其原始形式完全相同,因为 JNI 将尝试找到遵循一些固定约定的实现。根据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

简单来说就是Java_packagename_ClassName_methodsignature.

比如你的情况是Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha.

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