Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/stress/jni/libjnistress003.cpp
41155 views
/*1* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include <jni.h>24#include <stdio.h>25#include <stdlib.h>26#include "jnihelper.h"2728extern "C" {2930#define BOOL 031#define BYTE 132#define CHAR 233#define SHORT 334#define INT 435#define LONG 536#define FLOAT 637#define DOUBLE 73839JNIEXPORT jobjectArray JNICALL40Java_nsk_stress_jni_JNIter003_jniInitArrays (JNIEnv *env, jobject jobj, jint size) {4142jarray *arrayArray;43jboolean *boolBuf;44jbyte *byteBuf;45jchar *charBuf;46jshort *shortBuf;47jint *intBuf;48jlong *longBuf;49jfloat *floatBuf;50jdouble *doubleBuf;51jobjectArray objectsArray;5253int i;54int SIZE=size;55const char *classname="java/lang/Object";56jclass clazz = env->FindClass(classname); CE57objectsArray = env->NewObjectArray(8,clazz, env->AllocObject(clazz));5859arrayArray=(jarray *)malloc(8*sizeof(jarray)); CE60arrayArray[BOOL]=env->NewBooleanArray(SIZE); CE61arrayArray[BYTE]=env->NewByteArray(SIZE); CE62arrayArray[CHAR]=env->NewCharArray(SIZE); CE63arrayArray[SHORT]=env->NewShortArray(SIZE); CE64arrayArray[INT]=env->NewIntArray(SIZE); CE65arrayArray[LONG]=env->NewLongArray(SIZE); CE66arrayArray[FLOAT]=env->NewFloatArray(SIZE); CE67arrayArray[DOUBLE]=env->NewDoubleArray(SIZE); CE6869for (i=0;i<8;i++)70{ env->SetObjectArrayElement(objectsArray,i,arrayArray[i]); CE }7172boolBuf=(jboolean *)malloc(SIZE*sizeof(jboolean));73byteBuf=(jbyte *)malloc(SIZE*sizeof(jbyte));74charBuf=(jchar *)malloc(SIZE*sizeof(jchar));75shortBuf=(jshort *)malloc(SIZE*sizeof(jshort));76intBuf=(jint *)malloc(SIZE*sizeof(jint));77longBuf=(jlong *)malloc(SIZE*sizeof(jlong));78floatBuf=(jfloat *)malloc(SIZE*sizeof(jfloat));79doubleBuf=(jdouble *)malloc(SIZE*sizeof(jdouble));8081for (i=0;i<SIZE;i++) {82if (i%2 == 0) boolBuf[i]=JNI_TRUE;83else boolBuf[i]=JNI_FALSE;84/*85byteBuf[i]=(jbyte)random();86charBuf[i]=(jchar)random();87shortBuf[i]=(jshort)random();88intBuf[i]=(jint)random();89longBuf[i]=(jlong)random();90floatBuf[i]=(jfloat)((random()));91doubleBuf[i]=(jdouble)((random()));92*/93byteBuf[i]=(jbyte)109;94charBuf[i]=(jchar)214;95shortBuf[i]=(jshort)9223;96intBuf[i]=(jint)872634;97longBuf[i]=(jlong)276458276;98floatBuf[i]=(jfloat)235.4576284;99doubleBuf[i]=(jdouble)98275.716253567;100}101env->SetBooleanArrayRegion((jbooleanArray) arrayArray[BOOL],0,i,boolBuf); CE102env->SetByteArrayRegion((jbyteArray) arrayArray[BYTE],0,i,byteBuf); CE103env->SetCharArrayRegion((jcharArray) arrayArray[CHAR],0,i,charBuf); CE104env->SetShortArrayRegion((jshortArray) arrayArray[SHORT],0,i,shortBuf); CE105env->SetIntArrayRegion((jintArray) arrayArray[INT],0,i,intBuf); CE106env->SetLongArrayRegion((jlongArray) arrayArray[LONG],0,i,longBuf); CE107env->SetFloatArrayRegion((jfloatArray) arrayArray[FLOAT],0,i,floatBuf); CE108env->SetDoubleArrayRegion((jdoubleArray) arrayArray[DOUBLE],0,i,doubleBuf); CE109110free(doubleBuf);111free(floatBuf);112free(longBuf);113free(intBuf);114free(shortBuf);115free(byteBuf);116free(charBuf);117free(boolBuf);118free(arrayArray);119120return objectsArray;121}122123JNIEXPORT jboolean JNICALL124Java_nsk_stress_jni_JNIter003_jniBodyChangeArray (JNIEnv *env, jobject jobj,125jobjectArray orig, jobjectArray clone, jint limit) {126127#define SWAP(param1, param2) tmparr=param2; param2=param1; param1=tmparr;128#define SIZE(type) env->GetArrayLength(arrayClone[type])129130static volatile long count=0;131jarray *arrayOrig, *arrayClone;132jboolean *boolOrig, *boolClone;133jbyte *byteOrig, *byteClone;134jchar *charOrig, *charClone;135jshort *shortOrig, *shortClone;136jint *intOrig, *intClone;137jlong *longOrig, *longClone;138jfloat *floatOrig, *floatClone;139jdouble *doubleOrig, *doubleClone;140int i;141142if ((orig == NULL) || (clone == NULL)) {143fprintf(stderr,"JNI received a NULL array from Java\n");144return JNI_FALSE;145}146if (count == limit) {147jclass clazz;148const char *classname = "nsk/stress/jni/JNIter003";149const char *setdone = "halt";150const char *setdonesig = "()V";151jmethodID jmethod;152153fprintf(stderr, "Count and limit are: %ld\t%d cons.\n", count, limit);154clazz=env->FindClass(classname); CE155jmethod=env->GetMethodID(clazz, setdone, setdonesig); CE156env->CallVoidMethod(jobj, jmethod); CE157158return JNI_TRUE;159}160env->MonitorEnter(jobj); CE161++count;162env->MonitorExit(jobj); CE163arrayOrig=(jarray *)malloc(8*sizeof(jarray));164arrayClone=(jarray *)malloc(8*sizeof(jarray));165for (i=0;i<8;i++) {166arrayOrig[i]=(jarray) env->GetObjectArrayElement(orig,i); CE167arrayClone[i]=(jarray) env->GetObjectArrayElement(clone,i); CE168}169170/* Take the elements from Java arrays into native buffers */171/* Use Get<Type>ArrayElements */172boolOrig = env->GetBooleanArrayElements((jbooleanArray) arrayOrig[BOOL],0); CE173byteOrig = env->GetByteArrayElements((jbyteArray) arrayOrig[BYTE],0); CE174charOrig = env->GetCharArrayElements((jcharArray) arrayOrig[CHAR],0); CE175shortOrig = env->GetShortArrayElements((jshortArray) arrayOrig[SHORT],0); CE176intOrig = env->GetIntArrayElements((jintArray) arrayOrig[INT],0); CE177longOrig = env->GetLongArrayElements((jlongArray) arrayOrig[LONG],0); CE178floatOrig = env->GetFloatArrayElements((jfloatArray) arrayOrig[FLOAT],0); CE179doubleOrig = env->GetDoubleArrayElements((jdoubleArray) arrayOrig[DOUBLE],0); CE180181/* Alloc some memory for cloned arrays buffers */182boolClone=(jboolean *)malloc(SIZE(BOOL)*sizeof(jboolean));183byteClone=(jbyte *)malloc(SIZE(BYTE)*sizeof(jbyte));184charClone=(jchar *)malloc(SIZE(CHAR)*sizeof(jchar));185shortClone=(jshort *)malloc(SIZE(SHORT)*sizeof(jshort));186intClone=(jint *)malloc(SIZE(INT)*sizeof(jint));187longClone=(jlong *)malloc(SIZE(LONG)*sizeof(jlong));188floatClone=(jfloat *)malloc(SIZE(FLOAT)*sizeof(jfloat));189doubleClone=(jdouble *)malloc(SIZE(DOUBLE)*sizeof(jdouble));190191/* Take the elements from cloned Java arrays into native buffers */192/* Use Get<Type>ArrayRegion */193env->GetBooleanArrayRegion((jbooleanArray) arrayClone[BOOL],0,SIZE(BOOL),boolClone); CE194env->GetByteArrayRegion((jbyteArray) arrayClone[BYTE],0,SIZE(BYTE),byteClone); CE195env->GetCharArrayRegion((jcharArray) arrayClone[CHAR],0,SIZE(CHAR),charClone); CE196env->GetShortArrayRegion((jshortArray) arrayClone[SHORT],0,SIZE(SHORT),shortClone); CE197env->GetIntArrayRegion((jintArray) arrayClone[INT],0,SIZE(INT),intClone); CE198env->GetLongArrayRegion((jlongArray) arrayClone[LONG],0,SIZE(LONG),longClone); CE199env->GetFloatArrayRegion((jfloatArray) arrayClone[FLOAT],0,SIZE(FLOAT),floatClone); CE200env->GetDoubleArrayRegion((jdoubleArray) arrayClone[DOUBLE],0,SIZE(DOUBLE),doubleClone); CE201202/* In this code section I should make some changes for elements into both */203/* (original and cloned) arrays and than copied new values back to Java */204205/*206Can't change the pointer into the Java structure. It's illegal JNI.207SWAP(boolOrig,boolClone)208SWAP(byteOrig,byteClone)209SWAP(charOrig,charClone)210SWAP(shortOrig,shortClone)211SWAP(intOrig,intClone)212SWAP(longOrig,longClone)213SWAP(floatOrig,floatClone)214SWAP(doubleOrig,doubleClone)215*/216217/* Coping new values of elements back to Java and releasing native buffers */218/* Use Set<Type>ArrayRegion */219/*220Use Orig pointers to get the original effect of the test.221env->SetBooleanArrayRegion(arrayClone[BOOL],0,SIZE(BOOL),boolClone);222env->SetByteArrayRegion(arrayClone[BYTE],0,SIZE(BYTE),byteClone);223env->SetCharArrayRegion(arrayClone[CHAR],0,SIZE(CHAR),charClone);224env->SetShortArrayRegion(arrayClone[SHORT],0,SIZE(SHORT),shortClone);225env->SetIntArrayRegion(arrayClone[INT],0,SIZE(INT),intClone);226env->SetLongArrayRegion(arrayClone[LONG],0,SIZE(LONG),longClone);227env->SetFloatArrayRegion(arrayClone[FLOAT],0,SIZE(FLOAT),floatClone);228env->SetDoubleArrayRegion(arrayClone[DOUBLE],0,SIZE(DOUBLE),doubleClone);229*/230env->SetBooleanArrayRegion((jbooleanArray) arrayClone[BOOL],0,SIZE(BOOL),boolOrig); CE231env->SetByteArrayRegion((jbyteArray) arrayClone[BYTE],0,SIZE(BYTE),byteOrig); CE232env->SetCharArrayRegion((jcharArray) arrayClone[CHAR],0,SIZE(CHAR),charOrig); CE233env->SetShortArrayRegion((jshortArray) arrayClone[SHORT],0,SIZE(SHORT),shortOrig); CE234env->SetIntArrayRegion((jintArray) arrayClone[INT],0,SIZE(INT),intOrig); CE235env->SetLongArrayRegion((jlongArray) arrayClone[LONG],0,SIZE(LONG),longOrig); CE236env->SetFloatArrayRegion((jfloatArray) arrayClone[FLOAT],0,SIZE(FLOAT),floatOrig); CE237env->SetDoubleArrayRegion((jdoubleArray) arrayClone[DOUBLE],0,SIZE(DOUBLE),doubleOrig); CE238239/* Use Release<Type>ArrayElements */240env->ReleaseDoubleArrayElements((jdoubleArray) arrayOrig[DOUBLE],doubleOrig,0); CE241env->ReleaseFloatArrayElements((jfloatArray) arrayOrig[FLOAT],floatOrig,0); CE242env->ReleaseLongArrayElements((jlongArray) arrayOrig[LONG],longOrig,0); CE243env->ReleaseIntArrayElements((jintArray) arrayOrig[INT],intOrig,0); CE244env->ReleaseShortArrayElements((jshortArray) arrayOrig[SHORT],shortOrig,0); CE245env->ReleaseCharArrayElements((jcharArray) arrayOrig[CHAR],charOrig,0); CE246env->ReleaseByteArrayElements((jbyteArray) arrayOrig[BYTE],byteOrig,0); CE247env->ReleaseBooleanArrayElements((jbooleanArray) arrayOrig[BOOL],boolOrig,0); CE248free(arrayOrig);249250free(doubleClone);251free(floatClone);252free(longClone);253free(intClone);254free(shortClone);255free(byteClone);256free(charClone);257free(boolClone);258free(arrayClone);259260return JNI_TRUE;261}262263}264265266