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
如何在我的项目中调用这个函数?
我目前的尝试:
- 新Android具有 JNI 支持的 Studio 项目
- 添加文件夹\src\main\jniLibs\armeabi-v7a
- 复制libEncodeAndDecodeUtils.so到armeabi-v7a
- buid.bradle android{ defaultConfig { ndk {abiFilters "armeabi-v7a"} }
- 并创建 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
。
请原谅我绝对缺乏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
如何在我的项目中调用这个函数?
我目前的尝试:
- 新Android具有 JNI 支持的 Studio 项目
- 添加文件夹\src\main\jniLibs\armeabi-v7a
- 复制libEncodeAndDecodeUtils.so到armeabi-v7a
- buid.bradle android{ defaultConfig { ndk {abiFilters "armeabi-v7a"} }
- 并创建 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
。