问题描述
该函数在win平台上面调用不是很成功GUI会可以调出来但可能和屏蔽调其中的一些用到CUI的功能而调用CUI如masmexe是很不成功出现一个黑屏没用内容或者根本不有结果
其程序如下
class RunThread{
Process t
public void run(){
try{
t = javalangRuntimegetRuntime()exec(c:\\masmexe);
}catch(javaioIOException e )
{
Systemoutprintln(e);
}
}
}
/************************************************/
class RunExeNative{
public static void main(String args[]){
RunThread RT = new RunThread();
RTrun();
}
}
下面是JNI + C 的本地化的实现方法
写一个CallExeNativeh
步骤如下
step one :
/**** CallExeNativejava ****/
编写CallExeNativejava文件
import javalang*;
class CallExeNative{
public native static void CEN();
static
{
SystemloadLibrary(CallExeNative);
}
}
在命令行里用:
javac CallExeNativejava
javah CallExeNative
然后你就多了一个 CallExeNativeh
它的文件如下
/* DO NOT EDIT THIS FILE it is machine generated */
#include <jnih>
/* 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
这个文件不用改
下面要写一个CallExeNativec文件该函数的功能是将你的CUI文件调出来
文件如下
#include C:\CallExeNativeh/*在你的机器上调试时可能要修改该文件路径*/
#include <stdioh>
#include <processh>
#include <conioh>
JNIEXPORT void JNICALL Java_CallExeNative_CEN(JNIEnv* env jclass cl)
{
charprog[];
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 CallExeNativec
之后你 会发现生成了一个CallExeNativedll文件现在写RunExeNativejava文件
/*include
CallExeNativeh
CallExeNativedll
*/
import javalang*;
/*load a native method : to call a native file*/
class CallExeNative{
public native static void CEN();
static
{
SystemloadLibrary(CallExeNative);
}
}
/************************************************/
class RunExeNative{
public static void main(String args[]){
CallExeNative CEN = new CallExeNative();
CENCEN();
}
}
同样用
javac RunExeNativejava
java RunExeNative
之后你就会发现提示你输入CUI文件的路径
你输入路径即可!
说明要注意的是CallExeNativeh和CallExeNativedll应该都在同一个文件夹(我的是在c:\jdk_\bin\)
不足之处破坏了java的移植性!而且你想想看同样的功能在VB下用Shell(filepathwindowstyle)很容易就搞定你还会用java吗?我写这篇文章的目的是希望大家找到一种更好的方法来实现这个功能