请原谅我绝对缺乏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
我当前的尝试:
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
答案 0 :(得分:1)
如果您尝试通过自己的代码访问esha
,则必须声明此方法与其原始形式完全相同,因为JNI会尝试按照以下方法找到实现固定约定。根据{{3}}
解析本机方法名称
动态链接器根据其名称解析条目。本机方法名称由以下组件连接而成:
- 前缀Java_
- 完整的类名
- 下划线(_)分隔符
- 重载的本地方法的错误方法名称,
- 两个下划线(__),后跟经过修饰的参数签名
简单来说,它将类似于Java_packagename_ClassName_methodsignature
。
例如,在您的情况下为Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha
。
因此,请尝试从包名称中删除so_test4
。