jni的用法困惑

diablobaal 2011-08-24 03:57:50
我想调用delphi写的dll中的函数,请教如何写代码
dll主要代码如下:
type
Tvaluearray=array[0..400] of array[0..1] of shortstring;

function java_com_JavaCallDelphi_GetData(com:String;commid:integer):TResultArray;stdcall ;
var
...
begin
...
end;
小弟想问java调用dll的代码怎么写,以com=“1” commid=1为例,主要是数据类型TResultArray如何转换,请各位高手指教
...全文
120 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
boysmoyou01 2011-09-09
  • 打赏
  • 举报
回复
顶一下, 学习了》。。
diablobaal 2011-09-09
  • 打赏
  • 举报
回复
搞定了,具体代码如下:
JavaCallDelphi.java——
package com;
public class JavaCallDelphi {
static {
System.load("E:\\javatest\\test1\\YSCB_8DZZ\\ys_comm_YSCB_8DZZ.dll");
}

public native void showhello();
public native String GetValueData(int com,int commid);
public static void main(String[] args) {
new JavaCallDelphi().showhello();
new JavaCallDelphi().GetValueData(1, 1);
System.out.println(new JavaCallDelphi().toString());
}
}
在delphi的dll中,用GetValueData函数调用GetData函数,直接调用GetData函数不行,数组返回是不能直接调用的
休谱诺斯 2011-08-25
  • 打赏
  • 举报
回复
学习学习。。。
阳明 to life 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 diablobaal 的回复:]

那我到底该怎么写,头大啊
[/Quote]
http://www.delphifans.com/infoview/Article_4586.html
照着写试试
delphi的没玩过
或者你下个java native interface的书看看先
http://www.ppurl.com/2009/12/the-java-native-interface-programmers-guide-and-specification.html
diablobaal 2011-08-25
  • 打赏
  • 举报
回复
那我到底该怎么写,头大啊
阳明 to life 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 diablobaal 的回复:]

这我知道,我写得具体代码如下:
static {
System.loadLibrary("ys_comm_YSCB_8DZZ.dll");
}
public native ? java_com_JavaCallDelphi_GetData(String com,int commid);


我的意思是?的地方怎么写什么数据类型
[/Quote]
你jni完全理解错了吧,虽然delphi的编写方式不知道是不是不同,但是基本过程应该是一样的
先是编写一个native方法,然后编译成class,然后如果是C的话就javah编译成头文件,才得到的类似
function java_com_JavaCallDelphi_GetData(com:String;commid:integer):TResultArray;stdcall ;
这种函数,你这函数是你手写上去的吧,delphi的可以再找下实施流程
JNI调用时一般只支持基本数据类型,数组据我所知无法传
缘缘 2011-08-25
  • 打赏
  • 举报
回复
public native int GetData(String com , int commid);

function java_com_JavaCallDelphi_GetData(com:String;commid:integer):TResultArray;stdcall ;
这句话没有理解,GetData(参数),没看明白这句话有哪些参数,C比较差!
LMAOhuaNL 2011-08-25
  • 打赏
  • 举报
回复
写一般数据类型不行吗
diablobaal 2011-08-25
  • 打赏
  • 举报
回复
这我知道,我写得具体代码如下:
static {
System.loadLibrary("ys_comm_YSCB_8DZZ.dll");
}
public native ? java_com_JavaCallDelphi_GetData(String com,int commid);


我的意思是?的地方怎么写什么数据类型
阳明 to life 2011-08-25
  • 打赏
  • 举报
回复
写个native方法 和
static
{
System.loadLibrary(xxx.dll);
}
加载了调用native方法就行了
diablobaal 2011-08-25
  • 打赏
  • 举报
回复
没人知道吗
softroad 2011-08-25
  • 打赏
  • 举报
回复

Cookie.java

import java.util.HashMap;
import java.util.Map;

public class Cookie {

public native static String getCookie(String url);

static {
try {
System.loadLibrary("Cookie");
}
catch(UnsatisfiedLinkError e) {
System.err.println(e.getMessage());
}
}
}



Cookie.h


#include <jni.h>
/* Header for class pdm_tool_Cookie */

#ifndef _Included_pdm_tool_Cookie
#define _Included_pdm_tool_Cookie
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: pdm_tool_Cookie
* Method: getCookie
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_pdm_tool_Cookie_getCookie
(JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

Cookie.cpp

#include "Cookie.h"
#include <windows.h>
#include <wininet.h>
#include <iostream.h>

/*
* Class: Cookie
* Method: getCookie
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_pdm_tool_Cookie_getCookie
(JNIEnv *env, jclass, jstring jurl)
{
const char *url = env->GetStringUTFChars(jurl, 0);
TCHAR buffer [16384];
DWORD bufferSize = sizeof(buffer)/sizeof(buffer[0]);
BOOL bRes = InternetGetCookie(url, "", buffer, &bufferSize);
env->ReleaseStringUTFChars(jurl, url);
jstring jval = NULL;

if(bRes) {
jval = env->NewStringUTF(buffer);
}
else
{
jval = env->NewStringUTF("");
}

return jval;
}



以上是个调用vc++ dll的例子,仅供参考
蒙奇D路飞 2011-08-24
  • 打赏
  • 举报
回复
帮助你顶一下,delphi小白路过。。。
  • 打赏
  • 举报
回复
~ 路过!!赶紧跑

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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