LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2956|回复: 6

让JAVA成为C的前端(使用kaffe,免受SUN的统治)——测试平台Debian

[复制链接]
发表于 2005-12-26 10:48:54 | 显示全部楼层 |阅读模式
首先安装kaffe,apt-get install kaffe kaffe-dev。
将环境变量CLASSPATH设置为.:/usr/lib/kaffe/jre/lib/rt.jar:/usr/lib/kaffe/jre/lib/tools.jar
攻略一:
1)简单一点的。
准备HelloWorld.java文件


  1. class HelloWorld {
  2.     public native void displayHelloWorld();

  3.     static {
  4.         System.loadLibrary("hello");
  5.     }
  6.    
  7.     public static void main(String[] args) {
  8.         new HelloWorld().displayHelloWorld();
  9.     }
  10. }
复制代码

使用javac命令
~#javac HelloWorld.java
得到了HelloWorld.class文件。
使用javah命令
~#javah HelloWorld
得到了HelloWorld.h文件
后面就是C语言出场的时候了,dang dangdang dang!
准备HelloWorldImp.c文件


  1. #include "HelloWorld.h"
  2. #include <stdio.h>

  3. JNIEXPORT void JNICALL
  4. Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
  5. {
  6.     printf("Hello world!\n");
  7.     return;
  8. }
复制代码

将它编译成动态链接库
~#gcc HelloWolrdImp.c -shared -o libhello.so
设置LD_LIBRARY_PATH为当前目录
~#export LD_LIBRARY_PATH=`pwd`
只剩下最后一步,运行HelloWorld
~#java -classpath /usr/share/kaffe/Klasses.jar:. HelloWorld
成功了,呵呵


2)复杂一点的。
//
//如要把HelloWorld.class的main和native方法放在客户文件和库文件要怎么做?
//
更改HelloWorld.java文件


  1. package hello;

  2. public class HelloWorld {
  3.    
  4.     static {
  5.         System.loadLibrary("hello");
  6.     }
  7.          
  8.     public native void displayHelloWorld();
  9. }
复制代码

编译之
javac -d . HelloWorld.java
自动会在当前目录下创建hello目录,在hello目录下有HelloWorld.class文件
让javah创建c所需头文件
javah hello.HelloWorld
在当前目录下得到了hello_HelloWorld.h文件
让我们看一下hello_HelloWorld.h文件的内容


  1. #include <jni.h>

  2. #ifndef _Included_hello_HelloWorld
  3. #define _Included_hello_HelloWorld

  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif

  7. JNIEXPORT void JNICALL Java_hello_HelloWorld_displayHelloWorld(JNIEnv*, jobject);

  8. #ifdef __cplusplus
  9. }
  10. #endif

  11. #endif
复制代码

创建客户文件HelloWorldClinet.java文件


  1. import hello.HelloWorld;

  2. public class HelloWorldClient{
  3.      public static void main(String[] args) {
  4.         new HelloWorld().displayHelloWorld();
  5.     }
  6. }
复制代码

编译之
javac HelloWorldClient.java
得到HelloWorldClinet.class文件

这时候轮到主角C出场了,呵呵


  1. #include "hello_HelloWorld.h"
  2. #include <stdio.h>

  3. JNIEXPORT void JNICALL
  4. Java_hello_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
  5. {
  6.     printf("Hello world!\n");
  7.     return;
  8. }
复制代码

命名为HelloWorldImp.c。
编译之
gcc HelloWorldImp.c --shared -o libhello.so
重新设置LD_LIBRARY_PATH
export LD_LIBRARY_PATH=`pwd`
如此运行java HelloWorldClinet
:p 又成功了。

兄弟们,享受JAVA的方便与C的高效吧。
发表于 2005-12-26 15:15:20 | 显示全部楼层
不就是JNI嘛。写过java 调 delphi 版本的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-26 15:24:43 | 显示全部楼层
兄台明眼人啊,你看大家都故意不说出来。
回复 支持 反对

使用道具 举报

发表于 2005-12-26 22:41:59 | 显示全部楼层
我在想一个人应该怎样发展自己。是什么都去做做呢还是使自己成为某一个领域内的专家。比如我想做流媒体,会调用别人的算法去编解码视频流,会运用别人的协议来传输之后,在运用中有些不尽如人意的地方我就很想去研究这些算法本身看能不能得到改进。
    但在公司是件无奈的事情,任务总是排得满满的,永远也不可能做得完。做应用让我有种无根的浮萍的感觉。做的东西不会难,有不知道的看看帮助文档,查查手册,再不会来一下sir问题基本上就能得到解决。但刚刚把它的框架内容搞熟悉,你就被调去搞另外一个项目了,然后就是去熟悉另外一份帮助文档,另外一本手册。我总感觉这样的知识很难得到积累。也许大公司不会这样吧!
回复 支持 反对

使用道具 举报

发表于 2005-12-26 23:44:42 | 显示全部楼层
资本家就是不会让你掌握核心技术的
在哪都一样,个人想法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-27 12:44:29 | 显示全部楼层
Post by haohao_h
我在想一个人应该怎样发展自己。是什么都去做做呢还是使自己成为某一个领域内的专家。比如我想做流媒体,会调用别人的算法去编解码视频流,会运用别人的协议来传输之后,在运用中有些不尽如人意的地方我就很想去研究这些算法本身看能不能得到改进。
    但在公司是件无奈的事情,任务总是排得满满的,永远也不可能做得完。做应用让我有种无根的浮萍的感觉。做的东西不会难,有不知道的看看帮助文档,查查手册,再不会来一下sir问题基本上就能得到解决。但刚刚把它的框架内容搞熟悉,你就被调去搞另外一个项目了,然后就是去熟悉另外一份帮助文档,另外一本手册。我总感觉这样的知识很难得到积累。也许大公司不会这样吧!

我给个建议,你找一个比较轻松点的工作。然后把你大部分的业余时间用来做自己喜欢做的事情。
等你发现自己能在喜欢的事业上有发言权了,就可以选择跳槽真正做自己喜欢的工作了。
如果爱好能和工作一致,那就可以人剑合一了。
回复 支持 反对

使用道具 举报

发表于 2005-12-27 13:51:43 | 显示全部楼层
Post by 弥敦路九号
不就是JNI嘛。写过java 调 delphi 版本的。


ft, I am fooled.

太长时间不用java了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表