android - 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
如何在我的项目中调用此函数?
我目前的尝试:
- 支持 JNI 的新 AndroidStudio 项目
- 添加文件夹 \src\main\jniLibs\armeabi-v7a
- 将 libEncodeAndDecodeUtils.so 复制到 armeabi-v7a
- buid.bradle android{ defaultConfig { ndk {abiFilters "armeabi-v7a"} }
- 并创建类
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
解析本机方法名称
动态链接器根据其名称解析条目。本机方法名称由以下组件连接:
- 前缀 Java_
- 损坏的完全限定的类名
- 下划线 (“_”) 分隔符
- 重载本机方法的损坏方法名称,
- 两个下划线(“__”)后跟错误的参数签名
简而言之,它将类似于Java_packagename_ClassName_methodsignature
.
例如,在您的情况下,它是Java_com_midea_msmartsdk_common_utils_EncodeAndDecodeUtils_esha
.
因此,请尝试so_test4
从您的包名称中删除。
推荐阅读
- reactjs - 使用钩子和 redux 材料 ui 将值设置为文本字段
- excel - Vba宏来验证一个表是否包含另一个表的数据并复制行
- android - Android EditText 中的某些设备上未显示复制/粘贴菜单项
- ubuntu - 如何在 Ubuntu 上安装 hadolint
- html - jQuery DatePicker - 将语言更改为西班牙语
- sh - /bin/dash:匹配通配符时的奇怪行为 *
- arrays - 打印与数组元素不匹配的行
- python - Keras Sequential 模型拟合形状
- python - 查找列表中每个值的中位数
- flutter - 时间前具有特定时间格式