首页 Soft PlugIn RAN乱 Dev开发 Info资料 English WAP 留言 登陆 注册
-
Posted by Yippee | 评论(3) | 引用(0) | 阅读10147次
JNI JAVA编程初步

参考文档:IBM 用jni进行java编程 不过该网站比较慢,并且内容细化,页面比较多。最好下载ZIP包本地慢慢看。还有一个JNI入门教程之HelloWorld篇  CSDN的BLOG上的,经常访问不了,建议用BAIDU搜索后再看网页快照比较方便。我主要是参照第一篇。

Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java Software Development Kit (SDK))的一部分。JNI 允许 Java 代码使用以其它语言(譬如 C 和 C++)编写的代码和代码库。Invocation API(JNI 的一部分)可以用来将 Java 虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用 Java 代码。

1、WINDOWS:参照第一篇的步骤,基本没有什么问题,只要你安装了VC6以及设置一下JAVAC的BIN文件路径,不能编译JAVA文件时会报告 'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。

2、LINUX下编译:参照以前的BLOG设置好JDK。我用的是ULTRAEDIT的FTP文件编辑功能。其实也可以直接使用资源管理器直接FTP上去当作一个目录操作。

第一步编译JAVA文件:OK javac Sample1.java

public class Sample1
 {
   public native String stringMethod(String text);
   public static void main(String[] args)
   {
     System.loadLibrary("Sample1");
     Sample1 sample = new Sample1();
     String  text   = sample.stringMethod("JAVA");
     System.out.println("stringMethod: " + text);
   }
  }

第二步:javah Sample1得到.H文件

#include <jni.h>
#ifndef _Included_Sample1
#define _Included_Sample1
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

第三步:Windows: cl -Ic:\jdk\include -Ic:\jdk\include\win32 -LD Sample1.c -FeSample1.dll
Solaris: cc -G -I/usr/local/jdk/include -I/user/local/jdk/include/solaris Sample1.c -o Sample1.so

#include "Sample1.h"
#include <string.h>
JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  (JNIEnv *env, jobject obj, jstring string) {
    const char *str = (*env)->GetStringUTFChars(env, string, 0);
    char cap[128];
    int i=0;
    strcpy(cap, str);
    (*env)->ReleaseStringUTFChars(env, string, str);
    return (*env)->NewStringUTF(env, strupr(cap));
}
void main(){ }
结果在LINUX下,CC出错:: undefined reference to `strupr'
找了半天,发现是LINUX下不支持 strupr函数,因此换了一下测试代码

for(i=0;i<strlen(cap);i++)
     cap[i]=cap[i]+4;
    return (*env)->NewStringUTF(env, cap);

还有一个cc: unrecognized option `-G',不管了,看到SO文件生成了开始测试 java Sampe1

结果错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no Sample1 in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:992)
        at Sample1.main(Sample1.java:6)

又再次找了半天,发现是因为:jdk 1.3以后 System.loadLibrary 要用System.Load代替

重新编译、运行,结果Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: Sample1。

改为 System.load("Sample1.so");也是一样,一怒之下改为绝对路径,结果

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/sf/Sample1.so:/home/sft/Sample1.so: cannot dynamically load executable

在于LS一看,Sample1.so文件好像是可执行文件,一运行./Sample1.so,果然是的。想想前面编译时的问题,看来还是编译器CC的问题。应该这样编译:

gcc -fPIC -c Sample1.c
gcc -shared -o Sample1.so Sample1.o

最后重新运行 JAVA SAMPLE1。终于OK了。 330


字体:

Permanant URI永久地址 http://www.shengfang.org/blog/p/javajni1.php
Trackback URI引用地址 http://www.shengfang.org/blog/tb.php?tb_id=1115015113

2005年5月2日14:25星期一  [Dev开发] 追踪此文的RSS
rong在 2007年6月20日14:25星期三 评论:
楼主帮帮我啊,为什么我使用了下面的命令,
gcc -fPIC -c Sample1.c
gcc -shared -o Sample1.so Sample1.o
还是出现下面的错误
java -Djava.library.path=/root/JNIExe HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: /root/JNIExe/libhello.so: /root/JNIExe/libhello.so: cannot dynamically load executable
Yippee 回复于 2007年6月20日16:46

有没有试一试
直接使用以下命令也可以:
gcc -I/usr/java/jdk/include \
   -I/usr/java/jdk/include/linux \
   -c Simple.c -o Simple.o

另外,你代码里面好像还是LOAD的是SO文件吧
改为.O文件看看?

guoke在 2007年6月14日14:25星期四 评论:
搂主,你用JNI多久了?有什么心得吗? 很好Emotion
Yippee 回复于 2007年6月14日14:39

惭愧,只是那时候业余时间自己对这些感兴趣随便看看试验一下而已。根本没有实际使用过。

wsalvin在 2007年6月12日16:40星期二 评论:
直接使用以下命令也可以:
gcc -I/usr/java/jdk/include \
   -I/usr/java/jdk/include/linux \
   -c Simple.c -o Simple.o
Yippee 回复于 2007年6月13日09:42
谢谢指点。

称呼:    登陆   注册
   不注册,但记住我的信息
邮件:
(非必须)
评论: [UBB代码帮助]
粗体 斜体 下划线 链接 水平线 引用



验证码: 请输入你看见的数字
关闭UBB      提交时自动将内容复制到剪贴板

公告
Fire and Motion!

统计信息
[Yippee]||[统计]||日志:1790
在线: 18||用户: 2562 [列表]
今日:2421||到访:2671920
Rss:838508||评论:1584

最新日志

最新评论

友情链接

日历

最新引用

搜索

归档

杂项
Get RSS Feed (Version 2.0)
Get Atom Feed (Version 0.3)
编码:  UTF-8