@bits-innovate/react-native-vstarcam 1.0.32 → 1.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -237,11 +237,11 @@ public class VStarCamModule extends ReactContextBaseJavaModule {
|
|
|
237
237
|
}
|
|
238
238
|
Log.d(TAG, "======================");
|
|
239
239
|
|
|
240
|
-
// Load listener interfaces
|
|
241
|
-
stateListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientStateListener");
|
|
242
|
-
commandListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientCommandListener");
|
|
243
|
-
releaseListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientReleaseListener");
|
|
244
|
-
Log.d(TAG, "Listener interfaces loaded");
|
|
240
|
+
// Load listener interfaces using the same ClassLoader as JNIApi for consistency
|
|
241
|
+
stateListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientStateListener", true, jniApiClass.getClassLoader());
|
|
242
|
+
commandListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientCommandListener", true, jniApiClass.getClassLoader());
|
|
243
|
+
releaseListenerClass = Class.forName("com.vstarcam.app_p2p_api.ClientReleaseListener", true, jniApiClass.getClassLoader());
|
|
244
|
+
Log.d(TAG, "Listener interfaces loaded from ClassLoader: " + jniApiClass.getClassLoader());
|
|
245
245
|
|
|
246
246
|
// Log all methods on each listener for debugging
|
|
247
247
|
Log.d(TAG, "ClientStateListener methods:");
|
|
@@ -283,8 +283,17 @@ public class VStarCamModule extends ReactContextBaseJavaModule {
|
|
|
283
283
|
@Override
|
|
284
284
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
285
285
|
try {
|
|
286
|
-
|
|
287
|
-
|
|
286
|
+
String methodName = method.getName();
|
|
287
|
+
|
|
288
|
+
// Handle standard Object methods to avoid crashes on hashCode/toString calls via JNI
|
|
289
|
+
if (method.getDeclaringClass() == Object.class) {
|
|
290
|
+
if (methodName.equals("equals")) return proxy == args[0];
|
|
291
|
+
if (methodName.equals("hashCode")) return System.identityHashCode(proxy);
|
|
292
|
+
if (methodName.equals("toString")) return proxy.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(proxy));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
Log.d(TAG, "ClientStateListener." + methodName + " called");
|
|
296
|
+
if (methodName.equals("stateListener")) {
|
|
288
297
|
// args: long clientPtr, int state
|
|
289
298
|
final long clientPtr = (Long) args[0];
|
|
290
299
|
final int state = (Integer) args[1];
|
|
@@ -316,8 +325,17 @@ public class VStarCamModule extends ReactContextBaseJavaModule {
|
|
|
316
325
|
@Override
|
|
317
326
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
318
327
|
try {
|
|
319
|
-
|
|
320
|
-
|
|
328
|
+
String methodName = method.getName();
|
|
329
|
+
|
|
330
|
+
// Handle standard Object methods
|
|
331
|
+
if (method.getDeclaringClass() == Object.class) {
|
|
332
|
+
if (methodName.equals("equals")) return proxy == args[0];
|
|
333
|
+
if (methodName.equals("hashCode")) return System.identityHashCode(proxy);
|
|
334
|
+
if (methodName.equals("toString")) return proxy.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(proxy));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
Log.d(TAG, "ClientCommandListener." + methodName + " called");
|
|
338
|
+
if (methodName.equals("commandListener")) {
|
|
321
339
|
// args: long clientPtr, byte[] data, int length
|
|
322
340
|
final long clientPtr = (Long) args[0];
|
|
323
341
|
final byte[] data = (byte[]) args[1];
|
|
@@ -349,8 +367,17 @@ public class VStarCamModule extends ReactContextBaseJavaModule {
|
|
|
349
367
|
@Override
|
|
350
368
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
351
369
|
try {
|
|
352
|
-
|
|
353
|
-
|
|
370
|
+
String methodName = method.getName();
|
|
371
|
+
|
|
372
|
+
// Handle standard Object methods
|
|
373
|
+
if (method.getDeclaringClass() == Object.class) {
|
|
374
|
+
if (methodName.equals("equals")) return proxy == args[0];
|
|
375
|
+
if (methodName.equals("hashCode")) return System.identityHashCode(proxy);
|
|
376
|
+
if (methodName.equals("toString")) return proxy.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(proxy));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
Log.d(TAG, "ClientReleaseListener." + methodName + " called");
|
|
380
|
+
if (methodName.equals("releaseListener")) {
|
|
354
381
|
final long clientPtr = (Long) args[0];
|
|
355
382
|
Log.d(TAG, "Release callback: clientPtr=" + clientPtr);
|
|
356
383
|
}
|
|
@@ -483,6 +510,15 @@ public class VStarCamModule extends ReactContextBaseJavaModule {
|
|
|
483
510
|
return;
|
|
484
511
|
}
|
|
485
512
|
|
|
513
|
+
// Explicitly retain the client pointer to prevent premature release by native SDK
|
|
514
|
+
try {
|
|
515
|
+
Method retainMethod = jniApiClass.getMethod("retain", long.class);
|
|
516
|
+
retainMethod.invoke(null, sdkClientPtr);
|
|
517
|
+
Log.d(TAG, "JNIApi.retain called for: " + sdkClientPtr);
|
|
518
|
+
} catch (Exception re) {
|
|
519
|
+
Log.e(TAG, "Failed to call retain: " + re.getMessage());
|
|
520
|
+
}
|
|
521
|
+
|
|
486
522
|
// Generate a unique internal client ID
|
|
487
523
|
int ourClientPtr = nextClientPtr.getAndIncrement();
|
|
488
524
|
|