求助关于如何用java的界面调用已完成的c/c++程序 rt..写gui...最好能有个例子.谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java Native Interface以下是jni的简单作用:1. Java库函数不支持的功能(如平台有关的特点)2. 已有用其他语言编写的库函数、应用程序,希望能用java调用3. 效率的考虑(用汇编等) 调用方式:本地代码 java代码之间的相互交互 从java程序调用本地方法 1.在java程序中加入本地方法说明:public native void methodName(){};2.产生本地方法的头文件:javah –jni ClassName3.本地方法的实现与编译: 在c中方法名为:Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***)将头文件和(本地方法)实现文件编译成共享库文件 Java代码部分:n 定义native方法----当程序中的方法实现是采用java以外的语言时,必须以native关键字说明;n 加载共享库----System.loadLibrary(“libname”)方法可以实现共享库的加载,从而完成native方法在声明和实现之间的映射。(在类定义过程中,一般以static前缀来描述这一代码,从而隐式加载共享库,例如:static { System.loadLibrary(“libname”; )};另外,libname和库文件名的对应关系是平台相关的,如在Solaris中为liblibname.so,而Windows系统中为libname.so )为本地方法创建头文件:n 语法----javah –jni class文件名;n 目的----得出native方法的文件名,见(二。3),注意,比java中的native方法多两参数。本地方法实现:n 在c语言中,本地函数的写法如下: JNIEXPORT void JNICALL Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***){}n c语言代码应该包含下述头文件:jni.h及由javah生成的头文件。JNI就是用Java和C,C++语言交互。从Java调用C++来显示一个Hello,JNI!-1-写一个简单的Java类:JNIHello.java-------------------------------------------package jni;/** * <p>Title: JNIHello</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2004</p> * @author Luo * Date: 2005-3-31 * Time: 8:48:11 */public class JNIHello { static { System.loadLibrary("JNIHello"); } public static void main(String args[]) { System.out.println(getHello()); new JNIHello().sayHello(); } public static native String getHello(); public native void sayHello();}-------------------------------------------里面两个带native的方法,一个static,一个实例方法;一个返回String,一个void。比较具有代表性了吧 。native方法就是告诉虚拟机,这个方法由本地的代码实现。现在在windows下实现,就是dll了。--------------------------------------------2-用javah命令 javah jni.HNIHello 生成jni_JNIHello.h。jni_JNIHello.h-------------------------------------------/* DO NOT EDIT THIS FILE - it is machine generated */#i nclude "jni.h"/* Header for class jni_JNIHello */#ifndef _Included_jni_JNIHello#define _Included_jni_JNIHello#ifdef __cplusplusextern "C" {#endif/* * Class: jni_JNIHello * Method: getHello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_jni_JNIHello_getHello (JNIEnv *, jclass);/*如果觉得还不人意,下面介绍从jbuiler中如何建立(用 JB5 和 VC6.0 IDE 环境做 )JNI 的步骤。1. 建一个 JB 工程2. 选 File->New 或点一下工具栏的 New 图标,选第一页的 Class 类型,选 OK,把类名改为 HelloWorld, 包名随意,这里假设为空,把 Options 里面的五个选项全选上(可以酌情少选),产生一个新的名为 HelloWorld 或 xxx.HelloWorld 的class3. 修改一下这个 class,改成这个样子并保存:public class HelloWorld {public native void helloworld();static {System.loadLibrary("hello");}public static void main(String[] args) {new HelloWorld().helloworld();}}4. 这时在 project 流览器里可以看到刚刚产生的 HelloWorld.java文件,在这个文件上点鼠标右键,选属性,打开 Build 属性页 把 Generate jni file 叉叉划上,选 OK。5. 编译这个 java 文件,这时将会看到在 HelloWorld.java 文件.下面多了一个HelloWorld.h,这是我们将要用到的本地方法的头文件。6. 打开 VC,选 Tools->Options->Directries->Show directries for选中 include files。把 \include, \include\win32 这两个目录加进去。7. 选 File->New,给你的工程取个名字,在 project 页里选 Win32 Dynamic-Link Library,按 OK,选 Empty dll project8. 把开始的 HelloWorld.h 加到你的 VC 工程目录里面,并新建一个 HelloWorld.c(可以是你想要的任意 .c 结尾的名字)源文件。9. 在 HelloWorld.c 开始加上下面这几行声明:#i nclude#i nclude "HelloWorld.h"#i nclude // 因为下面要用到 printf 语句,所以要这个头文件。10. 把 HelloWorld.h 里面方法声明拷贝过来,有多少拷多少,我们这里只有JNIEXPORT void JNICALL Java_HelloWorld_helloworld(JNIEnv *, jobject)并加上函数第一个参数和第二个参数的名字,方法体如下:JNIEXPORT void JNICALLJava_HelloWorld_helloworld(JNIEnv *env, jobject obj){printf("Hello");}11. 在函数里加上任何你想要的 c 代码,按 F7,在工程的 debug 或 release 目录下将生成一个 dll 文件,把该 dll 文件改成 hello.dll (也可在 project->settings->link 里面直接把生成的文件名变成 (你想要的目录)/hello.dll),并把该 dll 放到一个你的path 环境 设置里能找到的目录,一般放在当前目录就可以了。12. 运行 java HelloWorld 如果你的 dll 和 class 都已经生成但是出现下面的异常java.lang.UnsatisfiedLinkError: no hello in shared library pathat java.lang.Runtime.loadLibrary(Runtime.java)at java.lang.System.loadLibrary(System.java)atat java.lang.Thread.init(Thread.java)是因为你的 dll path 设置不正确,检查你的 java 源文件里这一行: System.loadLibrary("hello");loadLibrary 的参数应为你的 dll 文件名,但不包括括展名,比如说 你的 dll 文件为abc.dll,则应这样调用 System.loadLibrary("abc");而不是 System.loadLibrary("abc.dll");本来想写一个 jni in a nutshell 的,结果还是写了这么一大串,看在我打字这么辛苦的份上,不要拿香蕉皮砸我。:)leaffall的package提示:jni方法需要加native关键字public native void myMethod();在javah -jni MyClass产生的.h 文件中会有:JNIEXPORT void JNICALLJava_MyClass_myMethod(JNIEnv *, jobject);如果你的类中有包的定义(package com.leaffall) 请修改为:JNIEXPORT void JNICALLJava_com_leaffall_MyClass_myMethod(JNIEnv *, jobject);还有一文章不错,可看http://www.51one.net/study/jsp/29595.html 我写的一个简单的例子,可以供参考:java代码: public class MyNative{static{System.loadLibrary( "MyNative" ); } public native static void HelloWord(); public native static String cToJava(); public static void main(String[] args) { MyNative nnative =new MyNative(); HelloWord(); cToJava(); }c++实现代码:#include "jni.h"#include "MyNative.h"JNIEXPORT void JNICALL Java_MyNative_HelloWord (JNIEnv *env, jclass jobject){ printf("hello word!\n"); }JNIEXPORT jstring JNICALL Java_MyNative_cToJava(JNIEnv *env, jclass obj){ jstring jstr; char str[]="Hello,word!\n"; jstr=env->NewStringUTF(str); return jstr;} netbeans properties 中文问题 一道面试题,考考你. 回复 几个对象生成方法 问题:JApplet调用paint()方法 如何动态改变工具栏上按钮的大小? class A如何调用class B中的组件和值? 父类修改了后,子类要不要从新编译? JBuilder输入的时候为什么光标总是有问题,往前跑 java网络编程的问题! 错误:java.lang.UnsupportedClassVersionError 大家用maven吗,感觉怎么样,如果用过,请发表一样看法,
-1-写一个简单的Java类:
JNIHello.java
-------------------------------------------
package jni;/**
* <p>Title: JNIHello</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* @author Luo
* Date: 2005-3-31
* Time: 8:48:11
*/
public class JNIHello {
static {
System.loadLibrary("JNIHello");
} public static void main(String args[]) {
System.out.println(getHello());
new JNIHello().sayHello();
} public static native String getHello(); public native void sayHello();
}
-------------------------------------------
里面两个带native的方法,一个static,一个实例方法;一个返回String,一个void。比较具有代表性了吧 。
native方法就是告诉虚拟机,这个方法由本地的代码实现。现在在windows下实现,就是dll了。
-------------------------------------------
-2-用javah命令 javah jni.HNIHello 生成jni_JNIHello.h。
jni_JNIHello.h
-------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#i nclude "jni.h"
/* Header for class jni_JNIHello */#ifndef _Included_jni_JNIHello
#define _Included_jni_JNIHello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_JNIHello
* Method: getHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jni_JNIHello_getHello
(JNIEnv *, jclass);/*如果觉得还不人意,下面介绍从jbuiler中如何建立(用 JB5 和 VC6.0 IDE 环境做 )
JNI 的步骤。
1. 建一个 JB 工程
2. 选 File->New 或点一下工具栏的 New 图标,选第一页的 Class 类型,选 OK,把类名改为 HelloWorld, 包名随意,这里假设为空,把 Options 里面的五个选项全选上(可以酌情少选),产生一个新的名为 HelloWorld 或 xxx.HelloWorld 的class
3. 修改一下这个 class,改成这个样子并保存:
public class HelloWorld {
public native void helloworld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().helloworld();
}
}
4. 这时在 project 流览器里可以看到刚刚产生的 HelloWorld.java文件,在这个文件上点鼠标右键,选属性,打开 Build 属性页 把 Generate jni file 叉叉划上,选 OK。
5. 编译这个 java 文件,这时将会看到在 HelloWorld.java 文件.下面多了一个HelloWorld.h,这是我们将要用到的本地方法的头文件。
6. 打开 VC,选 Tools->Options->Directries->Show directries for选中 include files。
把 \include, \include\win32 这两个目录加进去。
7. 选 File->New,给你的工程取个名字,在 project 页里选 Win32 Dynamic-Link Library,按 OK,选 Empty dll project
8. 把开始的 HelloWorld.h 加到你的 VC 工程目录里面,并新建一个 HelloWorld.c(可以是你想要的任意 .c 结尾的名字)源文件。
9. 在 HelloWorld.c 开始加上下面这几行声明:
#i nclude
#i nclude "HelloWorld.h"
#i nclude // 因为下面要用到 printf 语句,所以要这个头文件。
10. 把 HelloWorld.h 里面方法声明拷贝过来,有多少拷多少,我们这里只有JNIEXPORT void JNICALL Java_HelloWorld_helloworld(JNIEnv *, jobject)
并加上函数第一个参数和第二个参数的名字,方法体如下:
JNIEXPORT void JNICALL
Java_HelloWorld_helloworld(JNIEnv *env, jobject obj){
printf("Hello");
}
11. 在函数里加上任何你想要的 c 代码,按 F7,在工程的 debug 或 release 目录下将生成一个 dll 文件,把该 dll 文件改成 hello.dll (也可在 project->settings->link 里面直接把生成的文件名变成 (你想要的目录)/hello.dll),并把该 dll 放到一个你的path 环境 设置里能找到的目录,一般放在当前目录就可以了。
12. 运行 java HelloWorld 如果你的 dll 和 class 都已经生成但是出现下面的异常
java.lang.UnsatisfiedLinkError: no hello in shared library path
at java.lang.Runtime.loadLibrary(Runtime.java)
at java.lang.System.loadLibrary(System.java)
at
at java.lang.Thread.init(Thread.java)
是因为你的 dll path 设置不正确,检查你的 java 源文件里这一行: System.loadLibrary("hello");
loadLibrary 的参数应为你的 dll 文件名,但不包括括展名,
比如说 你的 dll 文件为abc.dll,则应这样调用 System.loadLibrary("abc");
而不是 System.loadLibrary("abc.dll");
本来想写一个 jni in a nutshell 的,结果还是写了这么一大串,看在我打字这么辛苦的份上,不要拿香蕉皮砸我。:)
leaffall的package提示:
jni方法需要加native关键字
public native void myMethod();在javah -jni MyClass产生的.h 文件中会有:
JNIEXPORT void JNICALL
Java_MyClass_myMethod(JNIEnv *, jobject);
如果你的类中有包的定义(package com.leaffall) 请修改为:
JNIEXPORT void JNICALL
Java_com_leaffall_MyClass_myMethod(JNIEnv *, jobject);还有一文章不错,可看http://www.51one.net/study/jsp/29595.html
java代码:
public class MyNative
{
static
{
System.loadLibrary( "MyNative" );
}
public native static void HelloWord();
public native static String cToJava();
public static void main(String[] args)
{
MyNative nnative =new MyNative();
HelloWord();
cToJava();
}c++实现代码:
#include "jni.h"
#include "MyNative.h"JNIEXPORT void JNICALL Java_MyNative_HelloWord (JNIEnv *env, jclass jobject)
{
printf("hello word!\n");
}
JNIEXPORT jstring JNICALL Java_MyNative_cToJava(JNIEnv *env, jclass obj)
{
jstring jstr;
char str[]="Hello,word!\n";
jstr=env->NewStringUTF(str);
return jstr;
}