c++中new出来的内存如何安全的传递给java?
char* p = new char[100];
如何将p中的数值安全的传递给java,避免内存泄露等事故。
另外p中存储的不是字符串而是数据,就是说可能有0.
与其对应的java类型好像是byte[],请jni高人出来解答,谢谢

解决方案 »

  1.   

    java可以接他的值
    但接不到他的内存吧
      

  2.   

    c计算出来的结果得传递给java啊? 怎么弄呢?
      

  3.   

    JNI的最基本的东西在这里我就不多讲了,我这里写了一个简单的例子给你参考;
    把以下的C++部分的代码放到用javac生成的C接口中就可以了.
    参数的签名可以用javap -s -private className 命令来获得.c++代码:
    BYTE byteresult[] = {0x00,0xFE,0x00,0x01,0x01};
    jbyteArray jbyteArrayResult = pEnv->NewByteArray(5);
    pEnv->SetByteArrayRegion(jbyteArrayResult,0,length,(jbyte *)byteresult);jclass obj = pEnv->GetObjectClass(jobj);
    jmethodID mid2 = pEnv->GetMethodID(obj,"changeComponent","([Ljava/lang/Byte;)V");
    pEnv->CallVoidMethod(jobj,mid2, jbyteArrayResult);
    (changeComponent为java中接收参数的一个方法,"([Ljava/lang/Byte;)V"是java中的参数的签名,我这里参数的类型为Byte[],C++中对应该的数据类型为; jbyteArray ,)JAVA 代码:
    public void changeComponent(Byte[] resultArray) {
    int length = resultArray.length;
    System.out.println("resultArray's length is \n"+length);
    byte[] byteResultArray = new byte[length];
    System.arraycopy(resultArray, 0, byteResultArray, 0, length);
     StringBuffer buff = new StringBuffer();
            buff.append("{");
            for (int i = 0; i < b.length; i++) {
                buff.append(toHexString(b[i]));
                if (i != b.length - 1) {
                    buff.append(", ");
                }
            }
            buff.append("}");
    System.out.println("resultArray is:");
    System.out.println(buff.toString());
    }
    运行结果:
    resultArray's length is 
    5
    resultArray is:
    {0x00,0xFE,0x00,0x01,0x01}
    java与c++的数据类型对昭表:
    Java类型 C++类型       JNI中定义的别名      
    int      long           jint 
    long     _int64         jlong 
    byte     signed char    jbyte 
    boolean  unsigned char  jboolean 
    char     unsigned short jchar 
    short    short          jshort 
    float    float          jfloat 
    double   double         jdouble 
    Object   _jobject*      jobject java类型和签名类型的对照表
    Java类型 对应的签名 
    boolean  Z 
    byte     B 
    char     C 
    shrot    S 
    int      I 
    long     L 
    float    F 
    double   D 
    void     V 
    Object   L用/分割包的完整类名;  Ljava/lang/String; 
    Array    [签名       [I       [Ljava/lang/String; 
      

  4.   

    jni java native interface
      

  5.   

    谢谢楼上的捧场,问题就是处在java Socket上。
    现在准备用java通过jni调用c的动态库来解决问题,所以...
      

  6.   

    这是没有办法的事情.这是C++与JAVA存在兼容问题所产生的.
      

  7.   


    用java通过jni调用c的动态库来解决问题是可以的呀...所以怎么了???????????
    有什么问题吗?????????