社区
Java
帖子详情
java可以调用非java的程序吗
bwindmill
2003-06-27 05:22:13
java可以调用非java的程序吗,如果能请问怎么实现,能否具体点,谢谢
...全文
33
3
打赏
收藏
java可以调用非java的程序吗
java可以调用非java的程序吗,如果能请问怎么实现,能否具体点,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yabbi21
2003-06-28
打赏
举报
回复
第一步是写出对固有方法及它的自变量进行声明的Java代码:
class ShowMsgBox {
public static void main(String [] args) {
ShowMsgBox app = new ShowMsgBox();
app.ShowMessage("Generated with JNI");
}
private native void ShowMessage(String msg);
static {
System.loadLibrary("MsgImpl");
}
}
现在编译您的Java源文件,并对编译出来的.class文件运行javah。javah是在1.0版里提供的,但由于我们要使用Java 1.1 JNI,所以必须指定-jni参数:
javah -jni ShowMsgBox
javah会读入类文件,并为每个固有方法声明在C或C++头文件里生成一个函数原型。下面是输出结果——ShowMsgBox.h源文件(为符合本书的要求,稍微进行了一下修改):
/* DO NOT EDIT THIS FILE
- it is machine generated */
#include <jni.h>
/* Header for class ShowMsgBox */
#ifndef _Included_ShowMsgBox
#define _Included_ShowMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ShowMsgBox
* Method: ShowMessage
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL
Java_ShowMsgBox_ShowMessage
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
此时,我们要做的全部事情就是写一个C或C++源文件,在其中包含由javah生成的头文件;并实现固有方法;然后编译它,生成一个动态链接库。这一部分的工作是与平台有关的,所以我假定读者已经知道如何创建一个DLL。通过调用一个Win32 API,下面的代码实现了固有方法。随后,它会编译和链接到一个名为MsgImpl.dll的文件里:
#include <windows.h>
#include "ShowMsgBox.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD dwReason, void** lpReserved) {
return TRUE;
}
JNIEXPORT void JNICALL
Java_ShowMsgBox_ShowMessage(JNIEnv * jEnv,
jobject this, jstring jMsg) {
const char * msg;
msg = (*jEnv)->GetStringUTFChars(jEnv, jMsg,0);
MessageBox(HWND_DESKTOP, msg,
"Thinking in Java: JNI",
MB_OK | MB_ICONEXCLAMATION);
(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
}
yabbi21
2003-06-28
打赏
举报
回复
JNI是一种包容极广的编程接口,允许我们从Java应用程序里调用固有方法。它是在Java 1.1里新增的,维持着与Java 1.0的相应特性——“固有方法接口”(NMI)——某种程度的兼容。NMI设计上一些特点使其未获所有虚拟机的支持。考虑到这个原因,Java语言将来的版本可能不再提供对NMI的支持,这儿也不准备讨论它。
目前,JNI只能与用C或C++写成的固有方法打交道。利用JNI,我们的固有方法可以:
■创建、检查及更新Java对象(包括数组和字串)
■调用Java方法
■俘获和丢弃“异常”
■装载类并获取类信息
■进行运行期类型检查
所以,原来在Java中能对类及对象做的几乎所有事情在固有方法中同样可以做到。
RAYLI
2003-06-28
打赏
举报
回复
能,用JNI可以通过调用C,C++的DLL来实现。
网上有很多实例的,自己找吧!
java
程序
调用
Oracle 存储过程 获取返回值(无返回,
非
结果集,结果集)
java
程序
调用
Oracle 存储过程 获取返回值(无返回,
非
结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为输出参 数。 下面是详细情况说明: 一:无返回值的存储过程
调用
存储过程: create or replace Procedure PRO_1(PARA1 in VARCHA
java
程序
中 外部有,求救!!如何在
java
程序
中調用外部
非
java
的exe文件?
#2先得到Runtimert=Runtime.getRuntimee()對象.]然后應用rt中的exec方法.如rt.exec(Stringcmd);cmd:完整的命令行.如:aaa.exe-cccpublicProcessexec(String[]cmdarray,String[]envp)throwsIOExceptionExecutesthespecifiedcomma...
Java
中如何
调用
VC的动态库
以前一篇的DLL为例阐述
Java
如何
调用
动态库目前存在一个VC编译的
非
MFC动态库DLL(具体如何生成
非
MFC动态库DLL见前一篇文章),名称为mydll.dll,其中有导出函数myadd:形如:int myadd(int,int),现
java
应用
程序
需要
调用
该动态库的myadd函数。具体实现步骤如下:1、编写
调用
mydll.dll的
java
程序
(1)
程序
testMyDll .
java
main方法中
调用
非
静态方法
public class text1{ public static void main(String [] args){ int a = 12; int b = 23; text1 aa = new text1(); aa.add(a,b); } public void add(int a,int
Java
51,408
社区成员
86,101
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章