LinuxSir.Org  
| 网站首页 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
 
主题工具
旧 05-12-14, 15:36 第 1 帖
realtang 帅哥
 
realtang 的头像
 
 
版主  
  注册日期: Apr 2004
  我的住址: 上海
  帖子: 1,276
  精华: 8
 

标题: Debian 下使用kaffe进行JNI的编程


SUN java JNI示例的Debian Kaffe版本
首先安装kaffe,apt-get install kaffe。
准备HelloWorld.java文件
代码:
class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }
使用javac命令
~#javac HelloWorld.java
得到了HelloWorld.class文件。
使用javah命令
~#javah HelloWorld
出错,提示没有设置CLASSPATH
~#export CLASSPATH=/usr/lib/kaffe/jre/lib
再次运行javah命令,提示打开对象HelloWorld失败。
~#javah -classpath /usr/share/kaffe/Klasses.jar:. HelloWorld
得到了HelloWorld.h文件
后面就是C语言出场的时候了,dang dangdang dang!
HelloWorldImp.c文件
代码:
#include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; }
将它编译成动态链接库
~#gcc HelloWolrdImp.c -shared -o libhello.so
设置LD_LIBRARY_PATH为当前目录
~#export LD_LIBRARY_PATH=`pwd`
只剩下最后一步,运行HelloWorld
~#java -classpath /usr/share/kaffe/Klasses.jar:. HelloWorld
成功了,呵呵







__________________
CPU : P4 2.0
主板 : 华擎P4VT8+
内存 : Kinston DDR400 512MB
显卡 : 七彩虹6200A-GD2 CT超频版
声卡 : 主板集成CMI9739六声道
硬盘 : 迈拓金钻10 80GB IDE
OS : Debian GNU/Linux Etch
GUI :GTK based on DirectFB
_______________________________
Help others by sharing your knowledge!

此帖于 05-12-14 15:40 被 realtang 编辑.
  realtang 当前离线   回复时引用此帖
旧 05-12-16, 12:54 第 2 帖
acguy
 
 
 
注册会员  
  注册日期: Sep 2003
  帖子: 232
  精华: 0
 

据说gcc自已的CNI更直观方便。
  acguy 当前离线   回复时引用此帖
旧 05-12-19, 09:13 第 3 帖
realtang 帅哥
 
realtang 的头像
 
 
版主  
  注册日期: Apr 2004
  我的住址: 上海
  帖子: 1,276
  精华: 8
 

引用:
作者: acguy
据说gcc自已的CNI更直观方便。
CNI主要是给C++使用JAVA的机会,而JNI主要是给JAVA使用C++的机会。这个是我粗浅的理解,不知道对不对。
  realtang 当前离线   回复时引用此帖
旧 05-12-26, 10:38 第 4 帖
realtang 帅哥
 
realtang 的头像
 
 
版主  
  注册日期: Apr 2004
  我的住址: 上海
  帖子: 1,276
  精华: 8
 

标题: 如果要把HelloWorld.class的main和native方法放在客户文件和库文件要怎么做??


更改HelloWorld.java文件
代码:
package hello; public class HelloWorld { static { System.loadLibrary("hello"); } public native void displayHelloWorld(); }
编译之
javac -d . HelloWorld.java
自动会在当前目录下创建hello目录,在hello目录下有HelloWorld.class文件
让javah创建c所需头文件
javah hello/HelloWorld
在当前目录下得到了hello_HelloWorld.h文件
让我们看一下hello_HelloWorld.h文件的内容
代码:
#include <jni.h> #ifndef _Included_hello_HelloWorld #define _Included_hello_HelloWorld #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_hello_HelloWorld_displayHelloWorld(JNIEnv*, jobject); #ifdef __cplusplus } #endif #endif
创建客户文件HelloWorldClinet.java文件
代码:
import hello.HelloWorld; public class HelloWorldClient{ public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }
编译之
javac HelloWorldClient.java
得到HelloWorldClinet.class文件

这时候轮到主角C出场了,呵呵
代码:
#include "hello_HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_hello_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; }
命名为HelloWorldImp.c。
编译之
gcc HelloWorldImp.c --shared -o libhello.so
重新设置LD_LIBRARY_PATH
export LD_LIBRARY_PATH=`pwd`
如此运行java HelloWorldClinet
请注意整个攻略中,应该将CLASSPATH设置为.:/usr/lib/kaffe/jre/lib/rt.jar:/usr/lib/kaffe/jre/lib/tools.jar
  realtang 当前离线   回复时引用此帖
旧 10-03-11, 14:03 第 5 帖
realtang 帅哥
 
realtang 的头像
 
 
版主  
  注册日期: Apr 2004
  我的住址: 上海
  帖子: 1,276
  精华: 8
 

想不到当年预言的java+c的编程趋势,现在在android SDK+NDK的今天得以实现。
  realtang 当前离线   回复时引用此帖
旧 10-03-18, 02:52 第 6 帖
hantsy
 
hantsy 的头像
 
 
注册会员  
  注册日期: May 2003
  我的住址: 广州
  帖子: 2,611
  精华: 3
 

~#java -classpath /usr/share/kaffe/Klasses.jar:. HelloWorld

这一行运行的应该是 HelloWorld.class 文件,所以之前的所有工作都是自歁欺人。

如果你运行的c编译出来的,我想应该使用./HelloWorld 来运行。

JNI 是为了让Java代码调用系统库,如linux下so,win下的dll等。

kaffe 十几前的东西,java 1时代的产物,java 2 开始,sun开始修改协议,以保证jvm的兼容性,这些山寨项目都夭折了。。。







__________________
Spring Live 中文版发布
Blog:http://hantsy.cublog.cn
Gmail/Gtalk:hantsy@gmail.com
  hantsy 当前离线   回复时引用此帖
旧 10-03-18, 09:16 第 7 帖
luoyong 帅哥
 
luoyong 的头像
 
 
★版主☆  
  注册日期: May 2003
  帖子: 734
  精华: 3
 

现在的kaffe还可以,跑跑swing什么的没问题,就是功能少了点。主要是现在开源的兼容虚拟机都在用GNU Classpath,兼容性比以前要好一些了。







__________________
Blog: http://www.pixel-white.com

Source Repo: http://github.com/Iacob
  luoyong 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 07:30


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2012, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2011, LinuxSir.Org