Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA和JNI-尝试引用未分配的内存_Java_C_Java Native Interface_Jna_Gnucobol - Fatal编程技术网

Java JNA和JNI-尝试引用未分配的内存

Java JNA和JNI-尝试引用未分配的内存,java,c,java-native-interface,jna,gnucobol,Java,C,Java Native Interface,Jna,Gnucobol,我正在使用JNI(现在使用JNA来查看问题是否发生了变化)将Java连接到C代码。这段代码有两个方法,我正在尝试使用,它们应该多次从Java代码中调用,但是,当我执行本机调用时,我得到了它: Call method one=我得到了一个响应 调用方法二=我得到了一个响应 再次调用方法1=尝试引用未分配的内存 (信号SIGSEGV) 此故障导致执行停止。 我试图单独调用第一个和第二个方法(而不是一个接一个地调用它们),但问题没有出现。当我一个接一个地打电话给他们的时候,这就发生了,就像他们应该

我正在使用JNI(现在使用JNA来查看问题是否发生了变化)将Java连接到C代码。这段代码有两个方法,我正在尝试使用,它们应该多次从Java代码中调用,但是,当我执行本机调用时,我得到了它:

  • Call method one=我得到了一个响应
  • 调用方法二=我得到了一个响应
  • 再次调用方法1=尝试引用未分配的内存
    (信号SIGSEGV)
  • 此故障导致执行停止。
我试图单独调用第一个和第二个方法(而不是一个接一个地调用它们),但问题没有出现。当我一个接一个地打电话给他们的时候,这就发生了,就像他们应该工作一样。看起来我没有像应该的那样释放内存,或者JNA/JNI正在这样做

C代码(JNI)

CALLExternMethod1和CALLExternMethod2不是问题所在。即使存在虚假响应且未使用方法,问题也会发生


有人有同样的问题吗?

在JNI版本中,您正在弹出一个本地参考框架,afaik也包含结果,而不保存结果。-JNA版本中的最后一个
memset
/
memcpy
使用了一个未初始化的指针,它是UB。@Jorn Vernee关于弹出的本地引用,即使在这之后,我也可以在Java中获得结果。而且,如果我把它摘下来,反应是一样的(问题也是一样)。最后一个memset/memcpy,它们不是必需的吗?我正在准备响应,以使用char*值(结尾为\0)。是的,但实际上需要初始化指针(例如
char*result=malloc(sizeof(struct3))
),现在它只是指向或多或少的随机内存位置。-如果删除
PopLocalFrame
,我看不出该代码有任何错误。老实说,只需返回
response
,而不释放它。gnu cobol的引用在哪里?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "struct1.h"
#include "struct2.h"
#include "struct3.h"
#include "CALLExternMethod1s.h" //Interface External method
#include "CALLExternMethod2s.h" //Interface External method
#include "com_Method1Java.h" //Interface to Java Class
#include "com_Method2Java.h" //Interface to Java Class

void printStruct(void * structPar, int structSize) {
    char buffer[structSize + 1];

    memcpy(buffer, structPar, structSize);

    buffer[structSize] = 0x00;

    printf("{'%s'}\n", buffer);
}


JNIEXPORT jstring JNICALL Java_com_Method1Java_method1(JNIEnv *env, jobject obj, jstring input){


    jboolean isCopy;

    const char *request = (*env)->GetStringUTFChars(env, input, &isCopy);
    struct1 struct1rec;
    struct2 struct2rec;
    char* response;
    int reqLen = strlen(request);

    reqLen = (reqLen <= sizeof(struct1)) ? reqLen : sizeof(struct1);

    memcpy(&struct1rec, request, reqLen );

    printf(" \n------ Struct1 Request ------\n ");
    printStruct(&struct1rec, sizeof(struct1));
    cob_init(0,NULL);
    CALLExternMethod1(&struct1rec,&struct2rec); //Method overrides struct2rec with the response
    response = malloc(sizeof(struct2) + 1);
    memset(response, 0x20, sizeof(struct2) );
    memcpy(response, &struct2rec, sizeof(struct2));
    response[sizeof(struct2)] = '\0';
    printf(" \n------ Struct2 Response ------\n ");
    printStruct(response, sizeof(struct2));

    (*env)->ReleaseStringUTFChars(env, input, request);

    jstring result = (*env)->NewStringUTF(env, response);

    free(response);

    (*env)->PopLocalFrame(env,NULL);
    printf("--- end of method1 JNI ---\n");

    return result;
}


JNIEXPORT jstring JNICALL Java_com_Method2Java__struct3(JNIEnv *env, jobject obj, jstring input){

    jboolean isCopy;

    const char *request = (*env)->GetStringUTFChars(env, input, &isCopy);
    struct3 struct3rec;
    char* response;
    int reqLen = strlen(request);
    reqLen = (reqLen <= sizeof(struct3)) ? reqLen : sizeof(struct3);
    memcpy(&struct3rec, request, reqLen );

    printf("\n------ Struct3 Request ------\n");
    printStruct(&struct3rec, sizeof(struct3));
    cob_init(0,NULL);
    CALLExternMethod2(&struct3rec); //Method overrides struct3Rec with the response

    response = malloc(sizeof(struct3) + 1);
    memset(response, 0x20, sizeof(struct3) );
    memcpy(response, &struct3rec, sizeof(struct3));
    response[sizeof(struct3)] = '\0';

    printf("\n------ Struct3 Response ------\n");
    printStruct(response, sizeof(struct3));

    (*env)->ReleaseStringUTFChars(env, input, request);

    jstring result = (*env)->NewStringUTF(env, response);

    free(response);

    printf("--- end of method2 JNI ---\n");
    (*env)->PopLocalFrame(env,NULL);

    return result;

}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "struct1.h"
#include "struct2.h"
#include "struct3.h"
#include "CALLExternMethod1s.h" //Interface External method
#include "CALLExternMethod2s.h" //Interface External method

void printStruct(void * structPar, int structSize) {
    char buffer[structSize + 1];

    memcpy(buffer, structPar, structSize);

    buffer[structSize] = 0x00;

    printf("{'%s'}\n", buffer);
}

char* method1(char *request){
    struct1 struct1rec;
    struct2 struct2rec;

    char* response;

    int reqLen = strlen(request);

    reqLen = (reqLen <= sizeof(struct1)) ? reqLen : sizeof(struct1);
    memcpy(&struct1rec, request, reqLen);

    printf("\n------ Struct1 Request -------- \n");
    printStruct(&struct1rec, sizeof(struct1));

    CALLExternMethod1(&struct1rec, &struct2rec); //Method overrides struct2rec with the response

    printf("\n------ Struct2 Response -------- \n");
    printStruct(&struct2rec, sizeof(struct2));

    response = malloc(sizeof(struct2) + 1);
    memset(response, 0x20, sizeof(struct2) );
    memcpy(response, &struct2rec, sizeof(struct2));
    response[sizeof(struct2)] = '\0';

    char* result;
    memset(result, 0x20, sizeof(struct2));
    result = response;

    free(response);

    return result;

}
char* method2(char *request){
    struct3 struct3Rec;
    char* response;

    memcpy(&struct3Rec,request, sizeof(struct3));

    printf("\n------ Struct3 Request -------- \n");
    printStruct(&struct3Rec, sizeof(struct3));


    CALLExternMethod2(&struct3Rec); //Method overrides struct3Rec with the response

    printf("\n------ Struct3 Response -------- \n");
    printStruct(&struct3Rec,sizeof(struct3));

    response = malloc(sizeof(struct3) + 1);
    memset(response, 0x20, sizeof(struct3) );
    memcpy(response, &struct3Rec, sizeof(struct3));
    response[sizeof(struct3)] = '\0';

    char* result;
    memcpy(result, response, sizeof(struct3));

    return result;
}

int main(int argc, char** args){

  return 0;
}
 (...)

 static {
     System.loadLibrary("libstuff");
 }

public static synchronized native String method1(String struct);

(...)