我用DefineClass()从C中定义了一个Java类,但得到了不满意的linkerror
我用JNI call DefineClass()从C中定义一个java类,然后为类中的本机方法注册本机回调。该类有两个静态方法,都是本机的。我使用RegisterNatives()注册本机函数。两个电话都成功了
但当我从Java代码中引用这些本机方法时,我得到了Java。lang.unsatifiedLinkError myPackage。我的班级。我的方法(一)五
但我知道DefineClass为myPackage返回了一个类对象。我和我的同学都知道这一点 myMethod(I)V已注册为该类上的方法
在main()即将执行时,我遇到了这个失败——对本机方法的调用就在这里(暂时是为了测试)
作为测试,我试着在同一个JNIEnv上两次给DefineClass打电话,看看发生了什么。我得到了一个重复的类定义错误。我还尝试在定义FindClass()后调用它,JNIEnv返回对已定义类的引用
因此,我正在动态地创建这个类,但当我试图引用它的方法时,它失败了
有什么想法吗?感谢所有的意见
平台:Windows,64位XP上的32位代码
# 1 楼答案
似乎无法使用DefineClass()定义本机方法,并直接从注入的代码中调用该本机方法。在注入的类中必须有一个蹦床方法(以Java字节码的形式),然后调用本机方法。只有到那时它才会起作用。我花了三天时间才弄明白
另一个问题是确保注入的代码有效。我尝试的代码看起来有效,但仔细检查后,我从常量池中提取了一个4字节大小的常量,作为8字节指令的操作数。所以验证者失败了。一旦修好了(还有土生土长的蹦床),一切都正常了
然而,我花了三天时间才完成各种排列。但在if工作时感觉很好
蹦床怎么跳?请参阅Java SDK附带的示例(C)。它们很长,不适合在这里发布