问题描述: 该函数在win平台上面调用不是很成功,GUI会可以调出来,但可能和屏蔽调其中的一些用到CUI的功能,而调用CUI如masm.exe是很不成功,出现一个黑屏,没用内容,或者根本不有结果。 其程序如下:
| class RunThread{ Process t public void run(){ try{ t = java.lang.Runtime.getRuntime().exec("c:\\masm.exe"); }catch(java.io.IOException e ) { System.out.println(e); } } } /******************/ class RunExeNative{ public static void main(String args[]){ RunThread RT = new RunThread(); RT.run(); } }
|
下面是JNI + C 的本地化的实现方法: 写一个:CallExeNative.h 步骤如下:
| step one : /**** CallExeNative.java ****/ 编写CallExeNative.java文件 import java.lang.*; class CallExeNative{ public native static void CEN(); static { System.loadLibrary("CallExeNative"); } }
|
在命令行里用:
| javac CallExeNative.java javah CallExeNative |
然后你就多了一个 :CallExeNative.h 它的文件如下:
| /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class CallExeNative */#ifndef _Included_CallExeNative #define _Included_CallExeNative #ifdef __cplusplus extern "C" { |
| #endif /* * Class: CallExeNative * Method: CEN * Signature: ()V */ JNIEXPORT void JNICALL Java_CallExeNative_CEN (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif |
这个文件不用改。 下面要写一个CallExeNative.c文件:该函数的功能是将你的CUI文件调出来 文件如下:
| #include "C:\CallExeNative.h"/*在你的机器上调试时可能要修改该文件路径*/ #include <stdio.h> #include <process.h> #include <conio.h>JNIEXPORT void JNICALL Java_CallExeNative_CEN(JNIEnv* env, jclass cl) { char prog[80]; printf("Hello CallExeNative!\n"); printf( "Enter name of program to exec: " ); gets( prog ); _execl( prog, prog, "_execl", "two", NULL ); } |
现在visual c++ 的cl 功能在命令行下 c:\>cl /LD CallExeNative.c 之后你 会发现生成了一个CallExeNative.dll文件,现在写RunExeNative.java文件:
| /*include CallExeNative.h CallExeNative.dll */ import java.lang.*; /*load a native method : to call a native file*/ |
| class CallExeNative{ public native static void CEN(); static { System.loadLibrary("CallExeNative"); } } /***************/ class RunExeNative{ public static void main(String args[]){ CallExeNative CEN1 = new CallExeNative(); CEN1.CEN(); } } |
同样用
| javac RunExeNative.java java RunExeNative |
之后你就会发现提示你输入CUI文件的路径 你输入路径即可! 说明:要注意的是CallExeNative.h和CallExeNative.dll应该都在同一个文件夹(我的是在c:\jdk1.3.1_11\bin\). 不足之处:破坏了java的移植性!而且你想想看,同样的功能在VB下用Shell(filepath,windowstyle)很容易就搞定,你还会用java吗?我写这篇文章的目的是希望大家找到一种更好的方法来实现这个功能。
|