Skip to content

Commit 4afe0e3

Browse files
committed
fix: total stability overhaul, resolve JNI crashes and motion playback memory corruption
1 parent e659b7e commit 4afe0e3

1 file changed

Lines changed: 31 additions & 7 deletions

File tree

native/src/CubismUserModel_JNI.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ class JniUserModel : public CubismUserModel {
4545

4646
_motionBuffers[motion] = std::move(motionBuf);
4747

48-
motion->SetFinishedMotionHandlerAndMotionCustomData([](ACubismMotion* self, void* data) {
49-
auto* model = static_cast<JniUserModel*>(data);
48+
motion->SetFinishedMotionHandlerAndMotionCustomData([](ACubismMotion* self) {
5049
auto* m = static_cast<CubismMotion*>(self);
50+
auto* model = static_cast<JniUserModel*>(m->GetFinishedMotionCustomData());
5151
model->onMotionEnd(m);
5252
}, this);
5353

@@ -67,6 +67,13 @@ class JniUserModel : public CubismUserModel {
6767
env->DeleteLocalRef(name);
6868
}
6969

70+
bool isHitTransformed(const char* id, float x, float y) {
71+
if (!_model || !_modelMatrix) return false;
72+
float mx = _modelMatrix->InvertTransformX(x);
73+
float my = _modelMatrix->InvertTransformY(y);
74+
return IsHit(CubismFramework::GetIdManager()->GetId(id), mx, my);
75+
}
76+
7077
void update(float dt) {
7178
if (!_model) return;
7279
_model->LoadParameters();
@@ -129,29 +136,46 @@ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_loadPoseNative(
129136
env->ReleaseByteArrayElements(buffer, data, JNI_ABORT);
130137
}
131138

132-
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_startMotionNative(JNIEnv* env, jclass, jlong ptr, jbyteArray buffer, jint priority) {
139+
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_loadExpressionNative(JNIEnv* env, jclass, jlong ptr, jbyteArray buffer, jstring name) {
140+
const char* n = env->GetStringUTFChars(name, nullptr);
133141
jsize len = env->GetArrayLength(buffer);
134142
jbyte* data = env->GetByteArrayElements(buffer, nullptr);
135-
((JniUserModel*)ptr)->startMotionCopy((const csmByte*)data, len, priority);
143+
((JniUserModel*)ptr)->LoadExpression((const csmByte*)data, len, n);
136144
env->ReleaseByteArrayElements(buffer, data, JNI_ABORT);
145+
env->ReleaseStringUTFChars(name, n);
137146
}
138147

139-
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_updateNative(JNIEnv*, jclass, jlong ptr, jfloat dt) {
140-
((JniUserModel*)ptr)->update(dt);
148+
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_createRendererNative(JNIEnv*, jclass, jlong ptr) {
149+
((JniUserModel*)ptr)->CreateRenderer();
141150
}
142151

143152
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_registerTextureNative(JNIEnv*, jclass, jlong ptr, jint index, jint textureId) {
144153
auto* r = ((JniUserModel*)ptr)->GetRenderer<CubismRenderer_OpenGLES2>();
145154
if (r) r->BindTexture(index, (GLuint)textureId);
146155
}
147156

157+
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_setDraggingNative(JNIEnv*, jclass, jlong ptr, jfloat x, jfloat y) {
158+
((JniUserModel*)ptr)->SetDragging(x, y);
159+
}
160+
148161
JNIEXPORT jboolean JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_isHitNative(JNIEnv* env, jclass, jlong ptr, jstring id, jfloat x, jfloat y) {
149162
const char* s = env->GetStringUTFChars(id, nullptr);
150163
bool hit = ((JniUserModel*)ptr)->isHitTransformed(s, x, y);
151164
env->ReleaseStringUTFChars(id, s);
152165
return hit;
153166
}
154167

168+
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_startMotionNative(JNIEnv* env, jclass, jlong ptr, jbyteArray buffer, jint priority) {
169+
jsize len = env->GetArrayLength(buffer);
170+
jbyte* data = env->GetByteArrayElements(buffer, nullptr);
171+
((JniUserModel*)ptr)->startMotionCopy((const csmByte*)data, len, priority);
172+
env->ReleaseByteArrayElements(buffer, data, JNI_ABORT);
173+
}
174+
175+
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_updateNative(JNIEnv*, jclass, jlong ptr, jfloat dt) {
176+
((JniUserModel*)ptr)->update(dt);
177+
}
178+
155179
JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_setParameterValueNative(JNIEnv* env, jclass, jlong ptr, jstring id, jfloat value) {
156180
const char* s = env->GetStringUTFChars(id, nullptr);
157181
((JniUserModel*)ptr)->GetModel()->SetParameterValue(CubismFramework::GetIdManager()->GetId(s), value);
@@ -186,4 +210,4 @@ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_drawNative(JNIE
186210
env->ReleaseFloatArrayElements(matrix, m_ptr, JNI_ABORT);
187211
}
188212

189-
}
213+
}

0 commit comments

Comments
 (0)