如何编写供JAVA调用的动态链接库DLL

大伟 2007-04-11 06:43:14
要求输入字符串类型
...全文
384 4 打赏 收藏 转发到动态 举报
写回复
用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(/*参数列表*/);

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧