今天我们领导给了我一个非常棘手的问题:他用vc创建一个共享内存,然后我用java对它进行读写,并且把读取的信息在网页中显示出来。
由于小弟才学了半年的java,再网页中显示信息还行,让我搞共享内存这么高深的东西,能力实在是不够,还望各位大哥不吝赐教。

解决方案 »

  1.   

    java可以调c,就像调用其它java类一样,只是接口不同而已
      

  2.   

    现在问题是我还要把共享内存中的信息显示到网页上,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
      

  3.   

    有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;}
    以上都是我以前做的测试,供你参考
      

  4.   

    谢谢 keiy(),我对第三种方法比较感兴趣,你能说的更详细一点么?
      

  5.   

    上面有详细的程序了
    java中定义了一个pRandom数组,然后用GetRandom函数传给C,在C中修改它的值(用SetByteArrayRegion函数),然后返回给JAVA
    你可编译试一下效果,具全JNI函数参考在sun官方网上就有
    要注意的是前两例是用C++写的,第3例用C写的