关于java中的共享内存的问题

wjf810609 2005-11-28 12:47:09
今天我们领导给了我一个非常棘手的问题:他用vc创建一个共享内存,然后我用java对它进行读写,并且把读取的信息在网页中显示出来。
由于小弟才学了半年的java,再网页中显示信息还行,让我搞共享内存这么高深的东西,能力实在是不够,还望各位大哥不吝赐教。
...全文
1167 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
christina_sll 2005-11-29
  • 打赏
  • 举报
回复
路过学习
wjf810609 2005-11-28
  • 打赏
  • 举报
回复
现在问题是我还要把共享内存中的信息显示到网页上,c如何把消息传给java呢?
brill1984 2005-11-28
  • 打赏
  • 举报
回复
复杂点,用jni掉C,C访问内存
zeq258 2005-11-28
  • 打赏
  • 举报
回复
学习下!
柯本 2005-11-28
  • 打赏
  • 举报
回复
上面有详细的程序了
java中定义了一个pRandom数组,然后用GetRandom函数传给C,在C中修改它的值(用SetByteArrayRegion函数),然后返回给JAVA
你可编译试一下效果,具全JNI函数参考在sun官方网上就有
要注意的是前两例是用C++写的,第3例用C写的
wjf810609 2005-11-28
  • 打赏
  • 举报
回复
谢谢 keiy(),我对第三种方法比较感兴趣,你能说的更详细一点么?
柯本 2005-11-28
  • 打赏
  • 举报
回复
有3种方法:
1.用JNI直接改JAVA class的字段:
http://community.csdn.net/Expert/topic/4420/4420121.xml?temp=1.244754E-02
(动态的也可改)
2.用JNI返回值给JAVA
public class Getname {
private static native String Getname() ;
static
{
System.loadLibrary( "Getname" );
}
public static void main(String args[]) {
System.out.println( Getname());
}
}
#include <windows.h>
#include "Getname.h"
JNIEXPORT jstring JNICALL Java_Getname_Getname
(JNIEnv *env, jclass)
{
jstring ret;
char buff[255];
unsigned long len=255;
GetUserName(buff,&len);
ret=env->NewStringUTF(buff);
return ret;
}
3.JAVA用参数给C,C修改后返回给JAVA
public class TestJNI
{


public static native int GetRandom(byte[] pRandom,int j);

static
{
System.loadLibrary( "TestJNI" );
}
public static void main( String[] args )
{
byte[] pRandom={49,48,48,48,48,0x0};
int r=TestJNI.GetRandom(pRandom,4);
for(int i=0;i<pRandom.length;i++)
System.out.println(pRandom[i]);
}


}

#include"TestJNI.h"
#include<stdio.h>
JNIEXPORT jint JNICALL Java_TestJNI_GetRandom (JNIEnv *env, jclass, jbyteArray pRandom, jint j)
{
jbyte *arrayBody = (env)->GetByteArrayElements(pRandom,NULL);
char *tmpdata = (char*)arrayBody ;

printf(" test [%s]\n ", tmpdata);

//现如何传出?????

jbyte buff[5];
buff[0]=31;
buff[1]=32;
buff[2]=33;
buff[3]=34;
buff[4]=0;

env->SetByteArrayRegion(pRandom,0,4,buff); // set byte[] values

return (jint)100;

}
以上都是我以前做的测试,供你参考
wjf810609 2005-11-28
  • 打赏
  • 举报
回复
如果可以,那又该如何实现呢?
wjf810609 2005-11-28
  • 打赏
  • 举报
回复
这个调用外部程序的例子我也知道。现在我想知道的调用外部程序时的返回值可不可以是c程序中的return值呢?
柯本 2005-11-28
  • 打赏
  • 举报
回复
现在问题是我还要把共享内存中的信息显示到网页上,c如何把消息传给java呢?
-----------------------------------------------------------------
C不用将消息传给JAVA,可用JAVA调用C的DLL,正如楼上几位所说,用JNI
我的一个JNI,JAVA调windows API的例子:
1.建TestAPI.java
public class TestAPI
{

public static void testshow(String msg)
{
testshow0(msg);
}
private static native int testshow0(String msg);

static
{
System.loadLibrary( "TestAPI" );
}
public static void main( String[] args )
{
testshow("Hello!");
}
}
2.javac TestAPI.java
3.javah -jni TestAPI
4.建TestAPI.c
#include <windows.h>
#include "TestAPI.h"
JNIEXPORT jint JNICALL Java_TestAPI_testshow0
(JNIEnv *env, jobject obj, jstring s)
{
const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
MessageBox(NULL,szStr,"TestAPI",MB_OK);
(*env)->ReleaseStringUTFChars( env, s, szStr );
}
6.cl -Id:\j2sdk1.4.2_09\include -Id:\j2sdk1.4.2_09\include\win32 -LD TestAPI.c user32.lib
7.java TestAPI
你将会看到java调用windwos API的MessageBox所产生的Hello对话框
环境:
JDK+VC


fxltsbl 2005-11-28
  • 打赏
  • 举报
回复
java可以调c,就像调用其它java类一样,只是接口不同而已
wjf810609 2005-11-28
  • 打赏
  • 举报
回复
偶求求各位老大了,我只有一个星期的时间啊
vvpang 2005-11-28
  • 打赏
  • 举报
回复
学习

偶不懂。。

81,115

社区成员

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

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