Ste*_*ett 6 java java-native-interface
我正在使用JNI调用DefineClass()从C定义一个java类,然后我注册本机类中的方法的本机回调.该类有两个静态方法,两者都是本机方法.我使用RegisterNatives()来注册本机函数.两个电话都成功了
但是当我从我的Java代码中引用这些本机方法时,我得到java.lang.UnsatisfiedLinkError myPackage.myClass.myMethod(I)V
但是我知道DefineClass为myPackage.myClass返回了一个类对象,我知道myMethod(I)V已经被注册为该类的一个方法.
我得到这个失败就像它要执行main()一样 - 对我的本机方法的调用是(暂时的,用于测试).
作为测试,我尝试在同一个JNIEnv上两次调用DefineClass来查看发生了什么.我得到一个重复的类定义错误.我也尝试在定义它之后调用FindClass()并且JNIEnv返回对已定义类的引用.
因此,我是动态创建类的definity,但是当我尝试引用它的方法时它失败了.
有任何想法吗?所有输入赞赏.
平台:Windows,64位XP上的32位代码.
Seems that you cannot define a native method using DefineClass() and call that native method directly from your injected code. You have to have a trampoline method in your injected class (in the form of Java byte codes) that then calls your native methods. Only then will it work. Took me three days to work that out.
另一个问题是确保您注入的代码有效。我尝试的代码看起来有效,但经过仔细检查,我从常量池中提取了一个 4 字节大小的常量作为 8 字节指令的操作数。所以验证者失败了。一旦修复了这个问题(以及原生蹦床),一切就都成功了。
然而,为了完成所有不同的排列,我花了 3 天的时间。不过工作时感觉很好。
蹦床要怎么做呢?请参阅 Java SDK 附带的示例(C 语言)。它们很长,不适合在这里发布。
| 归档时间: |
|
| 查看次数: |
1721 次 |
| 最近记录: |