社区
C++ Builder
帖子详情
如何编写供JAVA调用的动态链接库DLL
大伟
2007-04-11 06:43:14
要求输入字符串类型
...全文
389
4
打赏
收藏
如何编写供JAVA调用的动态链接库DLL
要求输入字符串类型
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
大伟
2007-05-23
打赏
举报
回复
问题已经解决了
具体步骤如下:
1. 由JAVA程序员生成一个.h文件
2.用这个文件来做动态链接库
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_easycode_print_ComPrint */
#ifndef _Included_com_easycode_print_ComPrint
#define _Included_com_easycode_print_ComPrint
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_easycode_print_ComPrint
* Method: print
* Signature: (I[B[B[B[B[B[B[B[B[B[B)I
*/
JNIEXPORT jint JNICALL Java_com_easycode_print_ComPrint_print
(JNIEnv *, jclass, jint, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif
.cpp
//功能:将Java的byte数组转换为C char *;
char * jbyteArrayToChar(JNIEnv * env, jbyteArray bytes)
{
char * rtn = NULL;
jsize len = env->GetArrayLength(bytes);
jbyte * arrayBody = env->GetByteArrayElements(bytes,0);
if(len > 0)
{
rtn = new char[len+1];//(char *)malloc(len+1);
memcpy(rtn, arrayBody, len);
rtn[len]=0;
}
env->ReleaseByteArrayElements(bytes, arrayBody, 0);
return rtn;
}
//---------------------------------------------------------------------------
JNIEXPORT jint JNICALL Java_com_easycode_print_ComPrint_print
(JNIEnv *env, jclass obj, jint gwid,
jbyteArray Txt0, jbyteArray Txt1, jbyteArray Txt2, jbyteArray Txt3, jbyteArray Txt4,
jbyteArray Txt5, jbyteArray Txt6, jbyteArray Txt7, jbyteArray Txt8, jbyteArray Txt9)
{
char *Txt[10];
Txt[0] = jbyteArrayToChar(env, Txt0); Txt[1] = jbyteArrayToChar(env, Txt1);
Txt[2] = jbyteArrayToChar(env, Txt2); Txt[3] = jbyteArrayToChar(env, Txt3);
Txt[4] = jbyteArrayToChar(env, Txt4); Txt[5] = jbyteArrayToChar(env, Txt5);
Txt[6] = jbyteArrayToChar(env, Txt6); Txt[7] = jbyteArrayToChar(env, Txt7);
Txt[8] = jbyteArrayToChar(env, Txt8); Txt[9] = jbyteArrayToChar(env, Txt9);
return 0;
}
rainfall19831109
2007-04-11
打赏
举报
回复
至于谈到变量类型,那是没问题的
只要使用Windows标准的类型就没问题了
其实想下也知道,如果不行的话,那么Window的API怎么可以供那么多程序调用呢?
只要类型和类型的长度匹配,就没问题的了...
大伟
2007-04-11
打赏
举报
回复
这个好像不行的因为变量的类型都不一样
rainfall19831109
2007-04-11
打赏
举报
回复
标准的Windows Dll 我不清楚Java是否能调用,但这样已经是做成供其他程序\语言调用DLL的办法了
新建DLL工程,里面编写各函数,注明各函数标识,例如:
extern "C" __declspec(dllexport) void __stdcall FunctionForJava(/*参数列表*/);
Java
调用
动态链接库
(
Java
调用
DLL
)
Java
调用
动态链接库
Java
调用
DLL
源码
用
java
调用
C或C++
动态链接库
java
调用
dll
用
java
调用
C或C++
动态链接库
原来如此简单
java
调用
dll
JAVA
调用
动态链接库
DLL
之JNative学习源码
JAVA
调用
动态链接库
DLL
之JNative学习源码,详细请参考:http://blog.csdn.net/testcs_dn/article/details/26980027
JNI--
java
调用
不同平台的
动态链接库
,
dll
,so,完美,全教程
我们知道,使用 JNI
调用
.
dll
/.so 共享类库是非常非常麻烦和痛苦的。 假如有一个现有的 .
dll
/.so 文件,假如使用 JNI 技术
调用
,我们首先需要另外使用 C 语言写一个 .
dll
/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,
调用
已有的 ?
dll
/so 中公布的函数。 然后再在
Java
中载进这个适配器
dll
/so ,再
编写
Java
?? native 函数作为
dll
中函数的代理。 经过 2 个繁琐的步骤才能在
Java
中
调用
本地代码。 因此,很少有
Java
程序员愿意
编写
调用
dll
/.so 库中的原生函数的
java
程序。这也使
Java
语言在客户端上乏善可陈。可以说 JNI 是
Java
的一大弱点!现在,不需要再羡慕 .NET 的 P/Invoke 机制了。 JNA 把对
dll
/.so 共享库的
调用
减少到了和 P/Invoke 相同的程度。 使用 JNA ,不需要再
编写
适配用的 .
dll
/.so ,只需要在
Java
中
编写
一个接口和一些代码,作为 .
dll
/.so 的代理,就可以在
Java
程序中
调用
dll
/so 。
java
调用
C语言
编写
的so库中的函数,
java
调用
C语言
编写
的
dll
库中的函数
java
调用
so,
java
调用
dll
也是同样的代码
C++ Builder
13,870
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章