java - C获取函数地址

标签 java c java-native-interface jvmti

在我的项目中,我正在实现一个 JNI 代理,它将所有 java native 方法重新绑定(bind)到我自定义“.c”文件中的自定义方法。因此,由于 JNI 代理在运行时绑定(bind)本地方法,因此我将只讨论运行时解决方案。

当 JNI 绑定(bind)本地方法时,将调用以下函数:

void JNICALL NativeMethodBind(jvmtiEnv *jvmti_env,
    JNIEnv* jni_env,
    jthread thread,
    jmethodID method,
    void* address,
    void** new_address_ptr)

此时,除非您将某些内容放入 void** new_address_ptr,否则 java 方法将绑定(bind)到 void* address 中的地址。因此,为了重新绑定(bind)窗帘方法,我只需要覆盖 new_address_ptr - 变量。

现在,我想将函数重新绑定(bind)到我的自定义 .c 文件中的函数地址,该文件包含数百种不同的方法。这就是我被困的地方。在拥有 .c 文件和函数的字符串名称的同时,如何在我的 .c 文件中获取相应函数的地址?

我在 windows64 机器上用 gcc 4.9.1 运行这个项目

最佳答案

如果您可以编辑自定义 *.c 文件,那么您可以使用一个结构来实现您想要实现的目标,然后您可以拥有一个包含两个成员的结构,例如:

struct func_details{
     char func_name[20];
     void (*custom_func)(void);
};

然后声明一个数组结构:

struct func_details my_functions[] = {
         {"function1 name as string", respective_func1}
         {"function2 name as string", respective_func2}
         {"function3 name as string", respective_func3}
};

现在你可以像这样在一个循环中做一个strcmp()

for(i=0; i<3; i++)
{
   if(strcmp(function_string, my_functions[i].func_name) == 0)
   {
      if(my_functions[i].custom_func != NULL)
          /*Call you method to update the address with my_functions[i].custom_func*/
   }
}

希望,我已经回答了你的问题。

关于java - C获取函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45141868/

相关文章:

c++ - 不满意链接错误 : undefined symbol _ZN5boost6system16generic_categoryEv in java (JNI)

java - 在哪里可以找到 Mac OS 的 jni 头文件

java - Libgdx 不会从舞台上删除 Actor

java - 将 uuid(UUID 类型)插入 mysql 时报告键 PRIMARY 的重复条目

c - PCRE 二进制文件?

c - for循环中的内存泄漏

java - Excel中的数据验证字段

JavaFX 和 CSS : Prevent CSS inheritence for inner TabPane

c - 带符号的十六进制字符串到 long int 函数

java - 分析 JNI 应用程序