gpt4 book ai didi

android - 更改 .so 库中的函数名称

转载 作者:行者123 更新时间:2023-11-29 18:34:37 24 4
gpt4 key购买 nike

我只有 1 个来自旧项目的 .so 文件。如何在不在项目或模块中创建相同包的情况下使用此文件?

最佳答案

实际上,您不需要更改.so 文件中的函数名称。您可以使用 dlopen在运行时动态加载你的 .so 库和 dlsym为您获取指针 YOUR_FUNCTION_NAME(),然后通过指针调用 YOUR_FUNCTION_NAME()。为此,您可以在当前项目中创建这样的“包装器”:

public class OldSoHelper {
public static native void loadOldSo();
public static native <TYPE_OF_RESULT> runFunFromOldSo(<PARAMETERS>);
public static native void unloadOldSo();
}

在当前工程对应的.c/.cpp文件中(例如默认为native-lib.cpp):

void *handle;
<TYPE_OF_OLD_FUNCTION> (*old_fun_wrapper)(<PARAMETERS_OF_OLD_FUNCTION>);

extern "C"
JNIEXPORT void JNICALL
Java_<YOUR_PACKAGE_NAME>_OldSoHelper_loadOldSo(JNIEnv *env, jclass type) {
handle = dlopen("<YOUR_OLD_SO>.so", RTLD_NOW);
old_fun_wrapper = (<TYPE_OF_OLD_FUNCTION> (*)(<PARAMETERS_OF_OLD_FUNCTION>))(dlsym(handle, "<OLD_FUNCTION_NAME_e.g._Java_com_abc_dee_Native_appInit>"));
}

extern "C"
JNIEXPORT jobject JNICALL
Java_<YOUR_PACKAGE_NAME>_OldSoHelper_runFunFromOldSo(JNIEnv *env, jclass type,
<PARAMETERS_FOR_OLD_FUNCTION>)
{
jclass ResultClass = env->FindClass("YOUR/PACKAGE/NAME/RESULT_CLASS");
jobject result = ...
jfieldID fieldId = env->GetFieldID(ResultClass, "<FIELD_NAME>", "<FILED_TYPE_LETTER>");

<TYPE_OF_OLD_FUNCTION> res = old_fun_wrapper(<PARAMETERS_FOR_OLD_FUNCTION>);

env->Set<TYPE>Field(result, fieldId , res.filed);

return result;
}

extern "C"
JNIEXPORT void JNICALL
Java_<YOUR_PACKAGE_NAME>_OldSoHelper_unloadOldSo(JNIEnv *env, jclass type) {
if (handle) {
dlclose(handle);
}
}

您可以从 java 代码中调用:

...
// when you need old .so e.g. in onCreate()
OldSoHelper.loadOldSo();
...

// when you no need to call function from old .so
<TYPE_OF_RESULT> result = OldSoHelper.runFunFromOldSo(<PARAMETERS>);

...
// when you no need old .so e.g. in onDestroy()
OldSoHelper.unloadOldSo();
...

关于android - 更改 .so 库中的函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com