日期:2014-05-20  浏览次数:20564 次

jni在回调函数里调用java代码的问题
问题参看这篇文章下面的第二条回复

http://blog.csdn.net/zealVampire/archive/2007/04/30/1593389.aspx

------解决方案--------------------
需要首先把JVM指针保存一份,以后AttachCurrentThred就可以用了,我这里没有问题的
------解决方案--------------------
调用java代码有什么问题?
------解决方案--------------------
有什么问题吗?


------解决方案--------------------
lxyyzm,

当前JVM运行是一个Process,它的JEnv *等应该是

HOOK有点像是一种进程的注入,当前JVM运行Process下的JEnv地址, 在其他进程中JEnv地址是不合法的。所以HOOK共享JEnv地址是不行的,
想象一下,当前JVM进程A, 另外一个进程B要是能直接采访A JVM的那个地址,那么window下进程可以随便控制其他进程了。

但是对于WINDOW的HANDLE句柄, 似乎是全局的地址,可以共享,所以HOOK 回调函数可以利用这个HANDLE找到窗口并发送消息,
只是JAVA SWING除了最外面FRAME是一个WINDOW外, 内部那些组件其实都是画上去的, 没有一个WINDOW HANDLE, 所以没办法发送消息到SWING的JBUTTON
等, 但是AWT和SWT似乎就是每个BUTTON其实就是一个WINDOW,所有有句柄,有句柄就可以发送消息。

--------------搜到的---------------
进程地址空间
所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从 Windows 2000 Server 开始,包括 Windows Server 2003)都有一个 boot.ini 开关,可以为应用程序提供访问 3 GB 的进程地址空间的权限,从而将内核模式地址空间限定为 1 GB。

具体HOOK可以参考这个文章
http://www.codeproject.com/KB/DLL/hooks.aspx

------解决方案--------------------
帮楼主顶一下