Git Product home page Git Product logo

java's Introduction

PubNub Java-based SDKs for Java / Android

Build Status Codacy Badge Codacy Badge Maven Central

This is the official PubNub Java SDK repository.

PubNub takes care of the infrastructure and APIs needed for the realtime communication layer of your application. Work on your app's logic and let PubNub handle sending and receiving data across the world in less than 100ms.

Get keys

You will need the publish and subscribe keys to authenticate your app. Get your keys from the Admin Portal.

Configure PubNub

  1. Integrate the Java SDK into your project:

    • for Maven, add the following dependency in your pom.xml:

      <dependency>
        <groupId>com.pubnub</groupId>
        <artifactId>pubnub-gson</artifactId>
        <version>6.4.5</version>
      </dependency>
    • for Gradle, add the following dependency in your gradle.build:

      implementation 'com.pubnub:pubnub-gson:6.4.5'
  2. Configure your keys:

    PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUserId"));
    pnConfiguration.setSubscribeKey("mySubscribeKey");
    pnConfiguration.setPublishKey("myPublishKey");
    
    PubNub pubnub = new PubNub(pnConfiguration);

Add event listeners

// SubscribeCallback is an Abstract Java class. It requires that you implement all Abstract methods of the parent class even if you don't need all the handler methods.

pubnub.addListener(new SubscribeCallback() {
    // PubNub status
    @Override
    public void status(PubNub pubnub, PNStatus status) {
        switch (status.getOperation()) {
            // combine unsubscribe and subscribe handling for ease of use
            case PNSubscribeOperation:
            case PNUnsubscribeOperation:
                // Note: subscribe statuses never have traditional errors,
                // just categories to represent different issues or successes
                // that occur as part of subscribe
                switch (status.getCategory()) {
                    case PNConnectedCategory:
                        // No error or issue whatsoever.
                    case PNReconnectedCategory:
                        // Subscribe temporarily failed but reconnected.
                        // There is no longer any issue.
                    case PNDisconnectedCategory:
                        // No error in unsubscribing from everything.
                    case PNUnexpectedDisconnectCategory:
                        // Usually an issue with the internet connection.
                        // This is an error: handle appropriately.
                    case PNAccessDeniedCategory:
                        // PAM does not allow this client to subscribe to this
                        // channel and channel group configuration. This is
                        // another explicit error.
                    default:
                        // You can directly specify more errors by creating
                        // explicit cases for other error categories of
                        // `PNStatusCategory` such as `PNTimeoutCategory` or
                        // `PNMalformedFilterExpressionCategory` or
                        // `PNDecryptionErrorCategory`.
                }

            case PNHeartbeatOperation:
                // Heartbeat operations can in fact have errors,
                // so it's important to check first for an error.
                // For more information on how to configure heartbeat notifications
                // through the status PNObjectEventListener callback, refer to
                // /docs/android-java/api-reference-configuration#configuration_basic_usage
                if (status.isError()) {
                    // There was an error with the heartbeat operation, handle here
                } else {
                    // heartbeat operation was successful
                }
            default: {
                // Encountered unknown status type
            }
        }
    }

    // Messages
    @Override
    public void message(PubNub pubnub, PNMessageResult message) {
        String messagePublisher = message.getPublisher();
        System.out.println("Message publisher: " + messagePublisher);
        System.out.println("Message Payload: " + message.getMessage());
        System.out.println("Message Subscription: " + message.getSubscription());
        System.out.println("Message Channel: " + message.getChannel());
        System.out.println("Message timetoken: " + message.getTimetoken());
    }

    // Presence
    @Override
    public void presence(@NotNull PubNub pubnub, @NotNull PNPresenceEventResult presence) {
        System.out.println("Presence Event: " + presence.getEvent());
        // Can be join, leave, state-change or timeout

        System.out.println("Presence Channel: " + presence.getChannel());
        // The channel to which the message was published

        System.out.println("Presence Occupancy: " + presence.getOccupancy());
        // Number of users subscribed to the channel

        System.out.println("Presence State: " + presence.getState());
        // User state

        System.out.println("Presence UUID: " + presence.getUuid());
        // UUID to which this event is related

        presence.getJoin();
        // List of users that have joined the channel (if event is 'interval')

        presence.getLeave();
        // List of users that have left the channel (if event is 'interval')

        presence.getTimeout();
        // List of users that have timed-out off the channel (if event is 'interval')

        presence.getHereNowRefresh();
        // Indicates to the client that it should call 'hereNow()' to get the
        // complete list of users present in the channel.
    }

    // Signals
    @Override
    public void signal(PubNub pubnub, PNSignalResult pnSignalResult) {
        System.out.println("Signal publisher: " + signal.getPublisher());
        System.out.println("Signal payload: " + signal.getMessage());
        System.out.println("Signal subscription: " + signal.getSubscription());
        System.out.println("Signal channel: " + signal.getChannel());
        System.out.println("Signal timetoken: " + signal.getTimetoken());
    }

    // Message actions
    @Override
    public void messageAction(PubNub pubnub, PNMessageActionResult pnActionResult) {
        PNMessageAction pnMessageAction = pnActionResult.getAction();
        System.out.println("Message action type: " + pnMessageAction.getType());
        System.out.println("Message action value: " + pnMessageAction.getValue());
        System.out.println("Message action uuid: " + pnMessageAction.getUuid());
        System.out.println("Message action actionTimetoken: " + pnMessageAction.getActionTimetoken());
        System.out.println("Message action messageTimetoken: " + pnMessageAction.getMessageTimetoken());]
        System.out.println("Message action subscription: " + pnActionResult.getSubscription());
        System.out.println("Message action channel: " + pnActionResult.getChannel());
        System.out.println("Message action timetoken: " + pnActionResult.getTimetoken());
    }

    // Files
    @Override
    public void file(PubNub pubnub, PNFileEventResult pnFileEventResult) {
        System.out.println("File channel: " + pnFileEventResult.getChannel());
        System.out.println("File publisher: " + pnFileEventResult.getPublisher());
        System.out.println("File message: " + pnFileEventResult.getMessage());
        System.out.println("File timetoken: " + pnFileEventResult.getTimetoken());
        System.out.println("File file.id: " + pnFileEventResult.getFile().getId());
        System.out.println("File file.name: " + pnFileEventResult.getFile().getName());
        System.out.println("File file.url: " + pnFileEventResult.getFile().getUrl());
    }
});

Publish/subscribe

pubnub.publish().channel(channelName)
  .message(messageJsonObject)
  .async((result, publishStatus) -> {
    if (!publishStatus.isError()) {
        // Message successfully published to specified channel.
    } else { // Request processing failed.
        // Handle message publish error
        // Check 'category' property to find out
        // issues because of which the request failed.
        // Request can be resent using: [status retry];
    }
});

Documentation

Support

If you need help or have a general question, contact [email protected].

java's People

Contributors

anovikov1984 avatar client-engineering-bot avatar crimsonred avatar dhleong avatar dkong avatar jeffgreen7 avatar kleewho avatar marceloinacio avatar marcin-cebo avatar maxpresman avatar michaljolender avatar ntoskrnl avatar parfeon avatar pax95 avatar pubnubcraig avatar qsoftdevelopment avatar sgholsonatl avatar smelody avatar stephenlb avatar supertinou avatar techwritermat avatar vladimir-bukhtoyarov avatar wkal-pubnub avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

java's Issues

Javadoc

Since there is no available source code for the version 3.4, some detailed documentation would be nice.

Or just release the source code, like the older versions.

Thanks.

Callbacks are all the same and are not interfaces (Android)

Hello

Is there any particular reason why you created one common class named Callback and all the pubnub actions accept this class as callback mechanism?
Because well-known best practice regarding Java is to create interfaces for that manner. This interfaces should define only methods that this callback needs. For example publish needs only successCallback and errorCallback so interface should define only these two methods because publish method doesn't need reconnectCallback and all other stuff.
So for your case you can do do one common interface (e.g. named Callback) that defines successCallback and errorCallback methods. Because all five methods (publish, subscribe, presence, detailedHistory and hereNow) uses at least these two methods. For example subscribe needs all five (connectCallback, disconnectCallback, reconnectCallback, successCallback and errorCallback) so you create interface for subscribe that extends common interface (e.g. named SubscribeCallback extends Callback) than you define just three missing methods and that is it.
If that is any particular reason why you do this like that, let me know. I really want to know and to extend my knowledge.

Best
zmeda

Multiple instances

Is it wise to instantiate PubNub multiple times throughout an app? (Android) If I call shutdown(), will it shutdown all instances?

Remove dependecy to jdk.unsupported

Most DTOs in the PubNub SDK don't have a default (empty) constructor. Gson, which is used to serialize and deserialize the DTOs, uses the empty constructor to create instances of the DTO classes. If this is not possible (as it is the case in most classes of the PubNub SDK), sun.misc.Unsafe.allocateInstance() is used for the allocation. This works fine under normal circumstances. However, since we use PubNub on a hardware with limited resources, we try to minimize the JRE size and memory usage. We use a tailored JRE that includes as few modules as possible.
sun.misc.Unsafe.allocateInstance() is part of the jdk.unsupported module, which we normally don't include in our JRE.

It would be helpful for us if empty constructors were added to all DTOs (for example with Lombok's @NoArgsConstructor) so that the PubNub SDK worked without the jdk.unsupported module.

https://github.com/pubnub/java/blob/master/android/examples/SubscribeAtBoot/src/com/pubnub/examples/subscribeAtBoot/PubnubService.java#L22

in PubnubService line 22
I am getting this error:

04-14 14:30:26.588  24679-24679/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.pubnub.examples.subscribeAtBoot, PID: 24679
java.lang.VerifyError: com/pubnub/api/PubnubCore
        at com.pubnub.examples.subscribeAtBoot.PubnubService.<init>(PubnubService.java:22)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1208)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:2556)
        at android.app.ActivityThread.access$1800(ActivityThread.java:138)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5050)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1264)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1080)
        at dalvik.system.NativeStart.main(Native Method)

My changes:

String channel = "52ac592bd98ebc8b52000002";
Pubnub pubnub = new Pubnub("pub-c-9935d7db-1e0f-4d08-be4a-4bf95690cce1", "sub-c-df2e4f1a-2cb8-11e3-849c-02ee2ddab7fe", false);

Use SLF4J or commons-logging for logging facade

Would it be possible to use either SLF4J or commons-logging as a logging facade in the PubNub API?

Currently the logging is implemented with Log4j which makes it difficult to integrate with a project that uses, for example, SLF4J for it's own logging. (You end up having two logging frameworks configured)

Using either of those abstractions will allow logging implementations to be swopped out as desired by the project using the PubNub API and not be forced to configure Log4j.

StrictMode VM Policy violation

Running in with StrictMode:

StrictMode.setVmPolicy(new VmPolicy.Builder().detectAll().penaltyLog().build());

I get the following warnings:

A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
  java.lang.Throwable: Explicit termination method 'end' not called
    at dalvik.system.CloseGuard.open(CloseGuard.java:184)
    at java.util.zip.Inflater.<init>(Inflater.java:82)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:96)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
    at com.pubnub.api.HttpClientCore.fetch(HttpClientCore.java:159)
    at com.pubnub.api.SubscribeWorker.process(SubscribeWorker.java:47)
    at com.pubnub.api.Worker.run(RequestManager.java:81)
    at java.lang.Thread.run(Thread.java:841)

I am using 3.5.6 for Android.

Goole app engine jar pubnub subscribe didnt go in successCallback

I am using google app engine 1.7.4 java.i didn't used python.and i used python google app engine jar for pubnub.

after subscribe called didn't go in successCallback but after i publish any message that i will get message in successCallback.

for that reason i didn't create multiple channel. Its doesn't provide
pubnub.subscribe( new String{'channel1','channel2'}, message_receiver )

It's only provide string parameter for subscribe channel.

Thanks & Regards
Divyesh

Message

// Signals @OverRide public void signal(PubNub pubnub, PNSignalResult pnSignalResult) { System.out.println("Signal publisher: " + signal.getPublisher()); System.out.println("Signal payload: " + signal.getMessage()); System.out.println("Signal subscription: " + signal.getSubscription()); System.out.println("Signal channel: " + signal.getChannel()); System.out.println("Signal timetoken: " + signal.getTimetoken());

Multiple channel subscription does not work

My callback looks like

public class SubscribeCallback extends Callback {
    private static final String TAG = "SubscribeCallback";

    @Override
    public void connectCallback(String channel, Object message) {
        Log.d(TAG, "CONNECT to " + channel + " with message: " + message.toString());
    }

    @Override
    public void disconnectCallback(String channel, Object message) {
        Log.d(TAG, "DISCONNECT to " + channel + " with message: " + message.toString());
    }

    @Override
    public void errorCallback(String channel, Object message) {
        Log.d(TAG, "ERROR to " + channel + " with message: " + message.toString());
    }

    @Override
    public void reconnectCallback(String channel, Object message) {
        Log.d(TAG, "RECONNECT to " + channel + " with message: " + message.toString());
    }

    @Override
    public void successCallback(String channel, Object message) {
        Log.d(TAG, "SUCCESS to " + channel + " with message: " + message.toString());
    }
}

And my code snippet looks like:

Pubnub pubnub = new Pubnub("demo", "demo", false);

Hashtable<String, String> channels = new Hashtable<String, String>();
channels.put("channel", "channel1");
channels.put("channel", "channel2");
try {
    pubnub.subscribe(channels, new SubscribeCallback());
} catch (PubnubException e) {
    e.printStackTrace();
}

Now my log looks like:

SubscribeCallback     ERROR to channel2 with message:
...
SubscribeCallback     RECONNECT to channel2 with message: [1,"Subscribe reconnected","numbers..."]

There is no sign of subscribing to "channel1" and also if I try to send myself (from dev console) messages... I only accepts on "channel2".

Regards

GAE integration broken

I can't seem to get the app engine java library to work. The error is as follows:

[INFO] java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "setFactory")
[INFO]  at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
[INFO]  at java.security.AccessController.checkPermission(AccessController.java:559)
[INFO]  at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
[INFO]  at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:383)
[INFO]  at java.lang.SecurityManager.checkSetFactory(SecurityManager.java:1629)
[INFO]  at java.net.HttpURLConnection.setFollowRedirects(HttpURLConnection.java:335)
[INFO]  at com.pubnub.api.HttpClientCore.init(Unknown Source)
...

The problem seems to be coming from the HttpURLConnection.setFollowRedirects which is blocked by GAE. By default, GAE will follow 5 redirects, see https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet?csw=1#Redirects. If you really need to change it, you need to use the instance specific call:

connection.setInstanceFollowRedirects(false);

Flagged Crypto.java Security vulnerability

Spotted this during a routine penetration testing exercise

This class: com/pubnub/api/vendor/Crypto.java

Potential Issues

  1. Configuration is vulnerable to padding oracle attacks : Encryption mode CBC with PKCS5/PKCS7 padding
  2. MD5 is also a weak hash known to have hash collisions.

The following algorithms are recommended:

Confidentiality algorithms: AES-GCM-256 or ChaCha20-Poly1305
Integrity algorithms: SHA-256, SHA-384, SHA-512, Blake2, the SHA-3 family
Digital signature algorithms: RSA (3072 bits and higher), ECDSA with NIST P-384
Key establishment algorithms: RSA (3072 bits and higher), DH (3072 bits or higher), ECDH with NIST P-384

Cryptographic Standard Algorithms Security vulnerability spotted in FileEncryptionUtilKT.kt

Spotted this during a routine penetration testing exercise

https://github.com/pubnub/java/blob/master/src/main/kotlin/com/pubnub/api/crypto/util/FileEncryptionUtilKT.kt

Mobile apps should not use cryptographic algorithms and protocols that have significant known weaknesses or are otherwise insufficient for modern security requirements. Algorithms that were considered secure in the past may become insecure over time; therefore, it's important to periodically check current best practices and adjust configurations accordingly.

These tests include verification that cryptographic algorithms are up to date and in-line with industry standards. Vulnerable algorithms include outdated block ciphers (such as DES and 3DES), stream ciphers (such as RC4), hash functions (such as MD5 and SHA1), and broken random number generators (such as Dual_EC_DRBG and SHA1PRNG).

Note that even algorithms that are certified (for example, by NIST) can become insecure over time.

Algorithms with known weaknesses should be replaced with more secure alternatives.

Outlined instances of cryptographic algorithms that are known to be weak, such as:

• DES, 3DES
• RC2
• RC4
• BLOWFISH • MD4
• MD5
• SHA1

Upon inspection we identified the following usage of outdated cryptographic algorithms in the following code parts:

 @Throws(NoSuchAlgorithmException::class)
    private fun randomIv(): ByteArray {
        val randomIv = ByteArray(IV_SIZE_BYTES)
        SecureRandom.getInstance("SHA1PRNG").nextBytes(randomIv)
        return randomIv
    }

Using only algorithms suggested by BSI; see the following resource for details: https://www.keylength.com/en/8/

NetworkOnMainThreadException

I was wondering if you guys have seen any other instances of this error. We were seeing this in 3.5.6 and 3.6.

I can't think of any reason why HttpURLConnection#disconnect would trigger a read there by triggering the NetworkOnMainThreadException

android.os.NetworkOnMainThreadException
       at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156)
       at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
       at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
       at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489)
       at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
       at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
       at java.io.InputStream.read(InputStream.java:162)
       at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
       at java.io.BufferedInputStream.read(BufferedInputStream.java:288)
       at com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream.read(HttpTransport.java:582)
       at libcore.io.Streams.skipByReading(Streams.java:158)
       at java.io.InputStream.skip(InputStream.java:227)
       at com.android.okhttp.internal.Util.skipAll(Util.java:249)
       at com.android.okhttp.internal.http.HttpTransport.discardStream(HttpTransport.java:214)
       at com.android.okhttp.internal.http.HttpTransport.access$200(HttpTransport.java:36)
       at com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream.close(HttpTransport.java:628)
       at com.android.okhttp.internal.Util.closeQuietly(Util.java:110)
       at com.android.okhttp.internal.http.HttpURLConnectionImpl.disconnect(HttpURLConnectionImpl.java:102)
       at com.pubnub.api.HttpClientCore.shutdown()
       at com.pubnub.api.HttpClient.reset()
       at com.pubnub.api.Worker.resetConnection()
       at com.pubnub.api.RequestManager.resetWorkers()
       at com.pubnub.api.RequestManager.resetHttpManager()
       at com.pubnub.api.PubnubCore._request()
       at com.pubnub.api.PubnubCore._subscribe_base()
       at com.pubnub.api.PubnubCore._subscribe_base()
       at com.pubnub.api.PubnubCore.resubscribe()
       at com.pubnub.api.PubnubCore.unsubscribe()
       at com.pubnub.api.Pubnub.unsubscribe()
       at com.pubnub.api.PubnubCore.unsubscribe()
       at com.pubnub.api.Pubnub.unsubscribe()
       at com.tophatter.services.LiveAuctionService$3.run(LiveAuctionService.java:211)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5293)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1259)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
       at dalvik.system.NativeStart.main(NativeStart.java)

unsubcription fails

I have integrated pubnub for Android
I want to unsubscribe all channels that my device has subscribed
So for this I am using statement below but still channels are not getting unsucribed

pubnub.unsubscribeAll();

Any idea why this is happening ?

Potential CWE-327

Hello guys.
Time-to-time we perform a Veracode security scan of our project compiled artifacts.
In addition to our code analysis, it also checks used 3rd-party libraries as well.
The latest scan has identified several security issues related to pubnub-gson-6.4.1.jar
I would be grateful for your opinion on this.

Here is the list of findings:

CWE-327, Use of a Broken or Risky Cryptographic Algorithm (Medium severity):

  • com.pubnub.api.crypto.cryptor.AesCbcCryptor.kt:91
  • com.pubnub.api.crypto.cryptor.LegacyCryptor.kt:203

Looks like both lines instantiate the class IvParameterSpec which is considered unsafe.

I would be glad to know what you think of it.

Thank you in advance.

java.lang.VerifyError

Hi

I am using pubnub-3.5.4, when calling:

new Pubnub(PUBLISH_KEY, SUBSCRIBE_KEY, SECRET_KEY)

I get the following error:

 E/AndroidRuntime: FATAL EXCEPTION: Thread-18901
        java.lang.VerifyError: com/pubnub/api/PubnubCore
        at com.omnipasteapp.pubnubclipboard.PubNubClientFactory.create(PubNubClientFactory.java:12)
        at com.omnipasteapp.pubnubclipboard.PubNubClipboard.run(PubNubClipboard.java:70)
        at java.lang.Thread.run(Thread.java:856)

Any ideas what might have gotten wrong?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.