java调用cobol_java - Java通过JNI C代码在HP Tandem上调用Cobol程序 - 堆栈内存溢出

我想通过java jni C代码调用Cobol程序。 调用Java代码后,出现以下错误:Java运行时环境检测到致命错误:SIGSEGV(0xb)位于pc = fffffffff2667174,pid = 1174405432,tid = 4

这是我在Tandem上编译的Cobol程序(XCOBFUNC.cob):ecobol -c -Wshared XCOBFUNC.cob

?ENV COMMON;INNERLIST

?INSPECT, SYMBOLS

IDENTIFICATION DIVISION.

PROGRAM-ID. XCOBFUNC.

AUTHOR. TEST.

ENVIRONMENT DIVISION.

CONFIGURATION SECTION.

SOURCE-COMPUTER. TANDEM-K2006.

OBJECT-COMPUTER. TANDEM-K2006.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 D-RESULT PIC S9(09) COMP.

LINKAGE SECTION.

77 D-STRING PIC X(20).

77 D-SHORT PIC 9(04) COMP.

77 D-LARGE PIC 9(08) COMP.

PROCEDURE DIVISION USING D-STRING, D-SHORT, D-LARGE.

000-INIT.

DISPLAY "I AM DOING COBOL NOW".

COMPUTE D-RESULT = D-LARGE / D-SHORT.

DISPLAY "D-STRING = " D-STRING.

DISPLAY "D-LARGE = " D-LARGE.

DISPLAY "D-SHORT = " D-SHORT.

DISPLAY "D-RESULT = " D-RESULT.

DISPLAY "LEAVING COBOL PROGRAM NOW".

EXIT-PROGRAM.

这是我的C源文件(HelloJNI.c):

#include

#include

#include "HelloJNI.h"

#include "cobincl.h"

// Implementation of native method sayHello() of HelloJNI class

JNIEXPORT jshort JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj, jint par1, jstring jName) {

char outCStr[128] = "From C Program";

jshort error = 0;

short ds;

long dl;

char *tx = "Displayed in COBOL";

const char *name = (*env)->GetStringUTFChars(env, jName, 0);

int i;

jint result = par1 + 5;

printf("Hello World!\n");

printf("par1 = %d \n", par1);

printf("par1 = %s \n", name);

(*env)->ReleaseStringUTFChars(env, jName, name);

ds = 100;

dl = 40000;

XCOBFUNC(tx, &ds, &dl);

printf("ds = %d\n", ds);

printf("I am back in C now and program is ending.\n");

return error;

}

这是我的C头文件(HelloJNI.h):

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class HelloJNI */

#ifndef _Included_HelloJNI

#define _Included_HelloJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloJNI

* Method: sayHello

* Signature: (ILjava/lang/String;)S

*/

JNIEXPORT jshort JNICALL Java_HelloJNI_sayHello

(JNIEnv *, jobject, jint, jstring);

#ifdef __cplusplus

}

#endif

#endif

这是我的cobincl.h:

void XCOBFUNC (char *, short *, long *);

#pragma FUNCTION XCOBFUNC (cobol)

这是我的Makefile:

CC=/usr/bin/c89

ELD=/usr/bin/eld

RM=rm -f

CFLAGS= -g -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/oss -I /G/system/system -I./include -Wallow_cplusplus_comments \

-Wextensions -D_XOPEN_SOURCE_EXTENDED=1 -Wnowarn=141,209,1506,262 \

-Wcall_shared -Wsystype=oss -Wtarget=tns/e -Wmap -Wverbose

#LDFLAGS = -set floattype IEEE_float -set SYSTYPE OSS -set HIGHPIN ON \

# -set CPlusPlusDialect neutral -dll -m -verbose \

# -l zcobdll -lcre -lcrtl -export_all

LDFLAGS = -set floattype IEEE_float -set SYSTYPE OSS -set HIGHPIN ON \

-set CPlusPlusDialect neutral -dll -m -verbose \

-lcre -lcrtl -l zcobdll -export_all

ALL = libhello.so

.SUFFIXES: .java .class .h .c .o

.c.o:

$(CC) $(CFLAGS) -c $<

all: $(ALL)

clean:

@$(RM) *.o *.so

HelloJNI.o: cobincl.h HelloJNI.h HelloJNI.c

libhello.so: HelloJNI.o XCOBFUNC.o

$(ELD) HelloJNI.o XCOBFUNC.o -o libhello.so $(LDFLAGS)

这是我的Java代码:

public class HelloJNI {

static {

System.loadLibrary("hello"); // Load native library at runtime

// hello.dll (Windows) or libhello.so (Unixes)

}

public HelloJNI() {

}

public void sendToC() {

int par1 = 5;

String name = "Test";

short temp = sayHello(par1, name);

System.out.println("temp = " + temp);

}

// Declare a native method sayHello() that receives nothing and returns void

private native short sayHello(int par1, String name);

//private native String sayHello(int par1, String name, String[] tokensKeys, String[] tokensValues);

// Test Driver

public static void main(String[] args) {

//new HelloJNI().sayHello(); // invoke the native method

HelloJNI myObject = new HelloJNI();

myObject.sendToC();

}

}

我很感谢您的帮助,如果有人可以向我展示有关如何通过JNI C程序java如何在HP Tandem Non-Stop上调用Cobol程序的示例,我将非常感谢。

Please see from compilation process:

File: /usr/local/home/urily/Java_C_COBOL/c/libcobol.so

Segment(Read/Write/Execute) Address Size

---------------------------------------------------------------------------

text(Read/Execute) 0x0000000078000000 0x00002000

File: libhello.so

Segment(Read/Write/Execute)

Section Address Size

---------------------------------------------------------------------------

text(Read/Execute) 0x0000000078000000 0x00001000

.tandem_info 0x0000000078000190 0x00000198

.lic 0x0000000078000328 0x00000188

.dynamic 0x00000000780004b0 0x00000150

.liblist 0x0000000078000600 0x00000020

.dynstr2 0x0000000078000620 0x00000032

.IA_64.unwind 0x0000000078000658 0x00000048

.IA_64.unwind_info 0x00000000780006a0 0x00000018

.IA_64.unwind.strings 0x00000000780006b8 0x0000004a

.rconst 0x0000000078000710 0x00000030

.plt 0x0000000078000740 0x00000020

.text 0x0000000078000780 0x00000080

.hash 0x0000000078000800 0x000000dc

.dynsym 0x00000000780008e0 0x00000360

.dynstr 0x0000000078000c40 0x000001bd

.hashval 0x0000000078000e00 0x00000090

.rela.dyn 0x0000000078000e90 0x00000030

我看到libhello.so和libcobol.so的段具有相同的地址0x0000000078000000。 我通过两个步骤手动创建了libcobol.so:

cobol -c -Wcall_shared -Wsystype = oss -Wmap XCOBFUNC.cob

/ usr / bin / eld XCOBFUNC.o -o libcobol.so -dll -m -verbose -l zcobdll -lcre -lcrtl

由于现在它们具有相同的地址,您如何创建具有不同地址的文本段?

在我的hs_err_pid.log下面

#

# A fatal error has been detected by the Java Runtime Environment:

#

# SIGSEGV (0xb) at pc=fffffffff2667174, pid=620757215, tid=4

#

# JRE version: 6.0

# Java VM: Java HotSpot(TM) Server VM (16.3-b01-svcnedccadmin:2011apr20-08:12 mixed mode nsk oss-ia64 )

# Problematic frame:

# C [(DLL zcrtldll)+0x0] printf + 0xF0 (DLL zcrtldll)+0x0

#

# Please report this error to HP customer support.

#

--------------- T H R E A D ---------------

Current thread (8330800): JavaThread "main" [_thread_in_native, id=4, stack(809e000,81a1400)]

Frame 0: __stdio_fp + 0x171 (DLL zcrtldll)

pc : 0xfffffffff2667171

ra : 0xfffffffff26d6bf0

sp : 0x081a0510

psp : 0x081a0540

cfm : 0x0000020c sol(ins+locals)=4, sof(ins+locals+outs)=12, sor=0

bsp : 0x081a1a10

fpsr : 0x9804c8a74433f

pr : 0x00008cbd

br[0] : 0xfffffffff26d6bf0

br[1] : 0x640303a0

br[2] : 0x00000000

br[3] : 0x00000000

br[4] : 0x00000000

br[5] : 0x00000000

br[6] : 0xfffffffff26d6b00

br[7] : 0xfffffffff90babc0

lc : 0x00000000

ec : 0x00000000

gr0 : 0x00000000 0

gr1 : 0x6cec84b0 1827439792

gr2 : 0x6cec8608 1827440136

gr3 : 0x7de00010 2111832080

gr4 : 0x6cec84b0 1827439792

gr5 : 0x081a0908 135923976

gr6 : 0x080a2000 134881280

gr7 : 0x0829e800 136964096

gr8 : 0x64011640 1677792832

gr9 : 0x00000008 8

gr10 : 0x08330800 137562112

gr11 : 0x00000000 0

gr12 : 0x081a0510 135922960

gr13 : 0xe0000002300009b6 -2305842999818450506

gr14 : 0x7de00010 2111832080

gr15 : 0x7de00028 2111832104

gr16 : 0xfffffffff26d6b00 -227710208

gr17 : 0x00000000 0

gr18 : 0x00000000 0

gr19 : 0x00000000 0

gr20 : 0x7dde01e0 2111701472

gr21 : 0x081a0870 135923824

gr22 : 0x081a0878 135923832

gr23 : 0x081a2038 135929912

gr24 : 0x7dde0100 2111701248

gr25 : 0x7dde0100 2111701248

gr26 : 0x8000000000000000 -9223372036854775808

gr27 : 0x6cf24918 1827817752

gr28 : 0x0000000c 12

gr29 : 0x00000001 1

gr30 : 0x00000000 0

gr31 : 0x00000000 0

gr32 : 0x00000001 1

gr33 : 0xc00000000000050d -4611686018427386611

gr34 : 0xfffffffff26d6bf0 -227709968

gr35 : 0x6cec84b0 1827439792

gr36 : 0x081a0800 135923712

gr37 : 0x8330fcc00000000 590833344963411968

gr38 : 0x081a08b4 135923892

gr39 : 0x0c6221a8 207757736

gr40 : 0x64099e10 1678351888

gr41 : 0x7eec9bb0 2129435568

gr42 : 0x08325fa0 137519008

gr43 : 0x08325fa0 137519008

fr1 : (0x0ffff,0x8000000000000000) 1

Stack: [809e000,81a1400], sp=81a0540, free space=%pk

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)

C [(DLL zcrtldll)+0x0] printf + 0xF0 (DLL zcrtldll)+0x0

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)

j HelloJNI.sayHello()V+0

j HelloJNI.main([Ljava/lang/String;)V+7

v ~StubRoutines::call_stub

--------------- P R O C E S S ---------------

Java Threads: ( => current thread )

106de800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=12, stack(10a69000,10aa8800)]

106da200 JavaThread "CompilerThread1" daemon [_thread_blocked, id=10, stack(10965000,109e4800)]

1059b600 JavaThread "CompilerThread0" daemon [_thread_blocked, id=9, stack(10861800,108e1000)]

106d4800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=8, stack(107e0000,1081f800)]

106b4000 JavaThread "Finalizer" daemon [_thread_blocked, id=7, stack(1075e000,1079d800)]

1062c400 JavaThread "Reference Handler" daemon [_thread_blocked, id=6, stack(1062f800,1066f000)]

=>8330800 JavaThread "main" [_thread_in_native, id=4, stack(809e000,81a1400)]

Other Threads:

105a6800 VMThread [stack: 105a9000,105e8800] [id=5]

106c2e00 WatcherThread [stack: 803c800,804c000] [id=11]

VM state: not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap

def new generation total 3712K, used 228K [8450000, 8850000, 99a0000)

eden space 3328K, 6% used [8450000, 8489150, 8790000)

from space 384K, 0% used [8790000, 8790000, 87f0000)

to space 384K, 0% used [87f0000, 87f0000, 8850000)

tenured generation total 8192K, used 0K [99a0000, a1a0000, c450000)

the space 8192K, 0% used [99a0000, 99a0000, 99a0100, a1a0000)

compacting perm gen total 65536K, used 1865K [c450000, 10450000, 10450000)

the space 65536K, 2% used [c450000, c6225a0, c622600, 10450000)

No shared spaces configured.

VM Arguments:

java_command: HelloJNI

Launcher Type: SUN_STANDARD

Environment Variables:

JAVA_HOME=/usr/tandem/java

PATH=/bin:/bin/unsupported:/usr/bin:/usr/ucb:/usr/tandem/java/bin:/usr/tandem/javaexth10/bin:/usr/tandem/sqlmx/bin:/usr/tandem/java/jre/bin:/usr/tandem/jdbcMx/current/bin:/usr/oracle/ggs:/usr/tandem/nssoap/t0865h01_AAX/tools:.:

SHELL=/bin/sh

--------------- S Y S T E M ---------------

OS:uname:NONSTOP_KERNEL dnb1 J06 19 NSE-W

CPU:total 1

Memory: 4k page, physical 0k

vm_info: Java HotSpot(TM) Server VM (16.3-b01-svcnedccadmin:2011apr20-08:12) for nsk oss-ia64 JRE (1.6.0), built on Apr 20 2011 09:18:56 by "svcnedccadmin" with c89

time: Mon May 9 18:51:12 2016

elapsed time: 1 seconds

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值