代码之家  ›  专栏  ›  技术社区  ›  Stephen Kellett

我用C定义了一个Java类,使用了DealCeCaseSe(),但是得到了不满意的链接错误。

  •  6
  • Stephen Kellett  · 技术社区  · 14 年前

    我用JNI调用定义CeLeCaseSe()从C定义一个Java类,然后注册原生类中的方法的本地回调。类有两个静态方法,这两个方法都是本机的。我使用registernatives()来注册本机函数。两个调用都成功。

    但是,当我从Java代码中引用这些本机方法时,我得到java. Lang.unCaseDebug Link KyMyPosial.MyCase.MyPo法(i)v。

    但我知道defineclass为mypackage.myclass返回了一个类对象,我知道 MyMethod(i)v已注册为该类的方法。

    我得到这个失败就像它将要执行main()-在这里调用我的本机方法(暂时,用于测试)。

    作为测试,我试着在同一个jnienv上两次调用defineclass来查看发生了什么。我得到一个重复的类定义错误。我还尝试在定义findclass()之后调用它,jnienv返回对已定义类的引用。

    因此,我无法动态地创建类,但是当我试图引用它的方法时,它失败了。

    有什么想法吗?感谢所有输入。

    平台:Windows,64位XP上的32位代码。

    1 回复  |  直到 13 年前
        1
  •  3
  •   Stephen Kellett    13 年前

    似乎您无法使用defineclass()定义本机方法并直接从注入的代码调用该本机方法。您必须在注入类中使用蹦床方法(以Java字节码的形式),然后调用您的本机方法。只有这样才能奏效。我花了三天时间来解决这个问题。

    另一个方法是确保注入的代码是有效的。我尝试的代码看起来是有效的,但仔细检查后,我从常量池中提取了一个4字节大小的常量作为8字节指令的操作数。所以验证失败了。一旦固定好了(和当地的蹦床),一切都开始工作了。

    然而,为了完成所有的排列,我花了3天的时间。不过,在国际单项体育联合会工作时感觉很好。

    蹦床怎么做?请参见与Java SDK一起使用的示例(在C中)。它们很长,不适合在这里张贴。