def setCharSlice(self, start: int, stop: int, step: int, val: Union[Sequence[str], str]): with self.jvm as (jvm, jenv): size = JArray.size(start, stop, step) jarr = self._jobj if step == 1 and is_memview(val) and val.itemsize == jni.sizeof( jni.jchar): val = val.as_ctypes if isinstance( val, memview) else memview(val).as_ctypes jenv.SetCharArrayRegion(jarr, start, size, jni.cast(val, jni.POINTER(jni.jchar))) else: if is_memview(val): val = val.obj jels = jenv.GetCharArrayElements(jarr) try: if isinstance( val, str) and step == 1 and JArray._jchar_equiv_unicode: print("UUUUUUUUUUUUUUUUU") jni.memmove( jni.byref(jels.contents, start * jni.sizeof(jni.jchar)), val, JArray.size(start, stop) * jni.sizeof(jni.jchar)) else: for ix, idx in enumerate(range(start, stop, step)): jels[idx] = val[ix] jenv.ReleaseCharArrayElements(jarr, jels) except Exception as exc: jenv.ReleaseCharArrayElements(jarr, jels, jni.JNI_ABORT) raise exc
def setByteSlice(self, start: int, stop: int, step: int, val: Union[Sequence[Union[int, bytes]], bytes, bytearray]): """???.""" with self.jvm as (jvm, jenv): size = JArray.size(start, stop, step) jarr = self._jobj if step == 1 and is_memview(val) and val.itemsize == jni.sizeof(jni.jbyte): val = val.as_ctypes if isinstance(val, memview) else memview(val).as_ctypes jenv.SetByteArrayRegion(jarr, start, size, jni.cast(val, jni.POINTER(jni.jbyte))) else: if is_memview(val): val = val.obj jels = jenv.GetByteArrayElements(jarr) try: if isinstance(val, (bytes, bytearray)): if step == 1 and JArray._jbyte_equiv_byte: if isinstance(val, bytearray): val = jni.from_buffer(val) # print(("RRRRRRRRRRRRRRRRRR", # type(jels), type(jels.contents), type(val))) jni.memmove(jni.byref(jels.contents, start), val, JArray.size(start, stop)) else: for ix, idx in enumerate(range(start, stop, step)): jels[idx] = val[ix] else: for ix, idx in enumerate(range(start, stop, step)): v = val[ix] jels[idx] = v[0] if isinstance(v, bytes) else v jenv.ReleaseByteArrayElements(jarr, jels) except Exception as exc: jenv.ReleaseByteArrayElements(jarr, jels, jni.JNI_ABORT) raise exc
def __init__(self, jenv: jni.JNIEnv=None, jstr: jni.jobject=jni.obj(jni.POINTER(jni.jchar)), own: bool = True): self.__jstr = jni.cast(jstr, jni.jstring) self.__size = 0 self.__jchars = jni.obj(jni.POINTER(jni.jchar)) if jenv is not None and jstr: length = jenv.GetStringLength(self.__jstr) jchars = jenv.GetStringChars(self.__jstr) try: self.__jchars = jni.new_array(jni.jchar, length + 1) jni.memmove(self.__jchars, jchars, length * jni.sizeof(jni.jchar)) self.__jchars[length] = "\0" finally: jenv.ReleaseStringChars(self.__jstr, jchars) self.__size = length