今天我们领导给了我一个非常棘手的问题:他用vc创建一个共享内存,然后我用java对它进行读写,并且把读取的信息在网页中显示出来。
由于小弟才学了半年的java,再网页中显示信息还行,让我搞共享内存这么高深的东西,能力实在是不够,还望各位大哥不吝赐教。
由于小弟才学了半年的java,再网页中显示信息还行,让我搞共享内存这么高深的东西,能力实在是不够,还望各位大哥不吝赐教。
解决方案 »
- jsp显示图像的路径问题~求救
- struts 跳转时页面空白!
- HIBERNATE查出数据,用STRUTS的SELECT标签如何显示
- web.xml文件中的标记(如<mark></mark>)是在何处声明的?
- 请问一下,为什么要在tomcat里配置数据源?
- <html:checkbox property="" >标签如何在默认情况下就被选上,谢谢。
- 弱弱的问,从那里下jdbc的数据库驱动?
- jb8中能不能把struts1.1集成进去呀!怎么弄直接替换吗!!!
- 好心人:::小第今日学习jsp,遇到第一个棘手的问题,至今不得解,恳请赐教
- ssh架构,sevice层继承dao层 这种结构合理吗?
- 關於jsp緩存問題,頑固個徹底呀,,,,
- 急救啊!怎么将文件复制到另一个目录下面?
-----------------------------------------------------------------
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
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;}
以上都是我以前做的测试,供你参考
java中定义了一个pRandom数组,然后用GetRandom函数传给C,在C中修改它的值(用SetByteArrayRegion函数),然后返回给JAVA
你可编译试一下效果,具全JNI函数参考在sun官方网上就有
要注意的是前两例是用C++写的,第3例用C写的