@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
- Log.d(TAG, "ClientStateListener." + method.getName() + " called");
287
- if (method.getName().equals("stateListener")) {
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
- Log.d(TAG, "ClientCommandListener." + method.getName() + " called");
320
- if (method.getName().equals("commandListener")) {
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
- Log.d(TAG, "ClientReleaseListener." + method.getName() + " called");
353
- if (method.getName().equals("releaseListener")) {
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bits-innovate/react-native-vstarcam",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "description": "React Native bridge for VStarCam P2P SDK",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",