JNI里面使用指针应该没有什么问题,我一般的操作都没有问题。但是你还是在JVM的环境中,好像对内存的申请有一定限制,我写的一个dll中
就出现了初始化一个_variant_t的时候
_variant_t t = _variant_t(str);//str长度有200k左右
出现了

# An EXCEPTION_STACK_OVERFLOW exception has been detected in native code outside the VM.
# Program counter=0x8f84c37
#

解决方案 »

  1.   

    to: ChDw
    请问,那行参中的指针变量你怎么处理?因为java中并没有指针?
      

  2.   

    什么叫行参中的指针?你在你的JNI函数中为什么要用什么行参?
      

  3.   

    就是c语言中,函数中的形参。
    现在问题是,许多形参都是指针,不知用java该怎么处理
      

  4.   

    c函数中的形参,现在形参是指针类型。在java中怎么处理?
      

  5.   

    你在C里面的函数当然都是指针啦。但是你在JNI中就是C语言了,你要传递什么参数给C的函数就直接用嘛!你可以通过JNI提供的方法 env->getString...之类的从函数的参数中得到一个
    char*就可以啦,我还是没有搞懂你要完成的东西,你举个例子吧
      

  6.   

    例如在此中有如下函数:void weo(SLKDF *sf, int *lk) {
    ......
    }SLKDF是结构类型,
    还有另外一个c函数:void dwl(SLKDF *sf,....) {
    ......
    }都是对结构的修改,包扩开辟的空间加大之类的原先在c中的main函数形如:
    main() {
    SLKDF *lxk =malloc(SLKDF);
    dwl(lxk,....); 
    weo(lxk,....);
    write( x,lxk, x); /* socket通信,要用到lxk */
    ...
    }
    现在用java怎么实现?
    最终达到的目的是,既把实参传递进去,又能把其中改变放映出来(即指针所能达到的目的)。
    谢谢!
      

  7.   

    必需转换出来,比如lxk 结构有15个成员,但现在我只需要其中的3个传给java,那你必需从lxk 结构中取出这个3个成员值,转换成字节数组,然后一次性传给java。
    如果有太多类似的东西你可以作个c(c++)2java通信协议。
      

  8.   

    啊?这么
    说真的,我对java可以说根本不熟。至于通信协议那更不知怎么回事。我想这样做下来,会不会太复杂了?完全用java写客户端,我想用的时间太长这是其一,
    其二,要java和c之间通信,用socket但是现在遇到的问题是,有些情况还不清楚,比如java-c之间的socket通信是否那么方便?java中的一些类型和c中的一些类型长度不一,现在要求的是一次传出一定格式的内存区域(根据我现在有的已经用c写好的客户端程序得知)。
    有没有什么好办法?