Java JNI本机调用*原型*在它们自己的类/命名空间中?
我编写了JNI包装器来导出嵌入JVM的C应用程序(G-WAN)的API。本机调用在C应用程序中实现,并使用registernations()导出 理想情况下,我会为G-WAN API提供一个“gwan”类: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
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无法解决”)。我还试图定义一个“包”(有相同的错误)。无论如何,谢谢你的尝试(我给了你写相关信息的时间点)。