Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI本机调用*原型*在它们自己的类/命名空间中?_Java_C_Java Native Interface - Fatal编程技术网

Java JNI本机调用*原型*在它们自己的类/命名空间中?

Java JNI本机调用*原型*在它们自己的类/命名空间中?,java,c,java-native-interface,Java,C,Java Native Interface,我编写了JNI包装器来导出嵌入JVM的C应用程序(G-WAN)的API。本机调用在C应用程序中实现,并使用registernations()导出 理想情况下,我会为G-WAN API提供一个“gwan”类: import gwan // G-WAN API public class hello { public static int jmain(long env, String[] args) { gwan.xbuf_cat(gwan.get_reply(env), "Hel

我编写了JNI包装器来导出嵌入JVM的C应用程序(G-WAN)的API。本机调用在C应用程序中实现,并使用registernations()导出

理想情况下,我会为G-WAN API提供一个“gwan”类:

import gwan // G-WAN API

public class hello {
   public static int jmain(long env, String[] args) {
      gwan.xbuf_cat(gwan.get_reply(env), "Hello World");
      return 200; // HTTP status (200:'OK')
   }
}
我想用上面的“#import gwan”之类的方法来导入本机调用原型,但目前我只有以下功能(可以使用):

同样,本机调用的实现是在G-WAN可执行文件中进行的(不是在存储在磁盘上的Java类中)

因为,如果可能的话,我希望本机调用原型位于它们自己的“gwan”类(或名称空间)中(如上面的第一个hello示例)

有什么建议吗? (请发布Java或JNI代码,因为我不是Java专家)


Disclamer:我参与了这个项目的开发。

我建议您阅读Sun now Oracle关于JNI的以下文章

在这之后,应该可以理解,但是一些伪代码及其未经测试的功能是将两个gwanapi调用移动到它自己的名为gwanapi.java的文件中

public class gwanapi {
public static native long get_reply(long answer);
public static native void xbuf_cat(long ctx,String str);
}
然后使用
javacgwanapi.java
->output:gwanapi.class编译该文件 为c/c++头实现键入javah-jni:

javah -jni gwanapi
在hello java类中,下一步应该调用
static{System.loadLibrary(“gwanapi”);}

伪代码和未测试

  public class hello{
    static{
        System.loadLibrary("gwanapi");
    }
    public static int jmain(long env,String args[]){
        gwanapi.xbuf_cat(gwanapi.get_reply(env),"Hello World!");
        return 200;
    }
}
你应该可以走了

但我可能遗漏了一两点,但我认为这是你应该做的最小工作量

顺便说一句,这也是JNI调用的某种形式的来源,以及它是如何工作的,并引导您访问更多具有更多信息的站点


谢谢

我建议您阅读Sun now Oracle关于JNI的以下文章

在这之后,应该可以理解,但是一些伪代码及其未经测试的功能是将两个gwanapi调用移动到它自己的名为gwanapi.java的文件中

public class gwanapi {
public static native long get_reply(long answer);
public static native void xbuf_cat(long ctx,String str);
}
然后使用
javacgwanapi.java
->output:gwanapi.class编译该文件 为c/c++头实现键入javah-jni:

javah -jni gwanapi
在hello java类中,下一步应该调用
static{System.loadLibrary(“gwanapi”);}

伪代码和未测试

  public class hello{
    static{
        System.loadLibrary("gwanapi");
    }
    public static int jmain(long env,String args[]){
        gwanapi.xbuf_cat(gwanapi.get_reply(env),"Hello World!");
        return 200;
    }
}
你应该可以走了

但我可能遗漏了一两点,但我认为这是你应该做的最小工作量

顺便说一句,这也是JNI调用的某种形式的来源,以及它是如何工作的,并引导您访问更多具有更多信息的站点


感谢

作为一名C程序员,我不得不阅读JVM的C源代码,发现Java用点而不是斜杠重新映射类(路径)名称

由于G-WAN目录层次结构使用IP地址定义侦听器和虚拟主机(
192.168.10.10_80/#domain.com/csp
),这些点混淆了
FindClass()
JNI调用,使其无法找到类

我还发现类路径分隔符对于Unix是“:”对于Windows是“;”。这不是我问题的原因,但可能会引起同样的问题

最后,我停止使用GCJ编译器的JVM,因为它不支持双精度格式化(至少从2006年开始)。使用OpenJDK或SUN/ORACLE JVM都可以正常工作


现在一切都好了。我将所有这些都发布在这里,以防对其他人有所帮助。

作为一名C程序员,我必须阅读JVM的C源代码,才能发现Java用点而不是斜杠重新映射类(路径)名称

由于G-WAN目录层次结构使用IP地址定义侦听器和虚拟主机(
192.168.10.10_80/#domain.com/csp
),这些点混淆了
FindClass()
JNI调用,使其无法找到类

我还发现类路径分隔符对于Unix是“:”对于Windows是“;”。这不是我问题的原因,但可能会引起同样的问题

最后,我停止使用GCJ编译器的JVM,因为它不支持双精度格式化(至少从2006年开始)。使用OpenJDK或SUN/ORACLE JVM都可以正常工作

现在一切都好了。我将所有这些都发布在这里,以防对其他人有所帮助。

我已经阅读了该文件(以及许多其他文件),并且已经尝试过了。它会导致相同的结果(“错误:gwanapi无法解决”)。我还试图定义一个“包”(有相同的错误)。无论如何,谢谢你的尝试(我给你写相关信息的时间打了一分)。我已经读过该文件(以及许多其他文件),我已经尝试过了。它会导致相同的结果(“错误:gwanapi无法解决”)。我还试图定义一个“包”(有相同的错误)。无论如何,谢谢你的尝试(我给了你写相关信息的时间点)。