Native c++ library cant work with kotlin but works with java

-2

HELLO i have kotlin project.

In my project i have to use pos device.

Pos device works with sample java project but my project does not work.

i put all .so files in jniLibs folder

System.loadLibrary method is working but external functions not working

when i try to use external native functions i get this error

E/art: No implementation found for void com.example.alknakralar.comValina.comValina.setLogFile(java.lang.String) (tried Java_com_example_alknakralar_comValina_comValina_setLogFile and Java_com_example_alknakralar_comValina_comValina_setLogFile__Ljava_lang_String_2)

here is the code

if (valina == null) {
            try {
                valina = comValina()
            } catch (e: Exception) {
                Toast.makeText(this, "Failed to load native library. " + e.message, Toast.LENGTH_SHORT).show()
            }
        }

        if (valina == null) return

        try {
            valina!!.setLogFile("debug-Valina.txt")
            //valina!!.SetLogFile("debug-Valina.txt")
            //valina!!.SetLogLevel(comValina.eComValinaLogLevel.DEBUG_LEVEL_NOTICE)

        } catch (e: Exception) {
            Log.i("avs", "sa 3$e")
        }

this is my code valina!!.setLogFile("debug-Valina.txt") here is the error line

class comValina {
    external fun setLogFile(LogFile: String)
    private external fun SetLogLevel(LogLevel: Byte)
    private external fun InitializeTcpServer(PortNumber: Short): Int
    external fun Payment(amount: Int): Int

    enum class eComValinaLogLevel constructor(val value: Byte) {
        DEBUG_LEVEL_FATAL(0.toByte()),
        DEBUG_LEVEL_ERROR(1.toByte()),
        DEBUG_LEVEL_WARNING(2.toByte()),
        DEBUG_LEVEL_NOTICE(3.toByte())
    }

    companion object {
        init {
            try {
                System.loadLibrary("comValina-android-armeabi")
            } catch (e: Exception) {
            } catch (ex: UnsatisfiedLinkError) {
            }

            try {
                System.loadLibrary("comValina-android-armeabi-v7a")
            } catch (e: Exception) {
            } catch (ex: UnsatisfiedLinkError) {
            }
        }
    }

    fun SetLogLevel(LogLevel: eComValinaLogLevel) {
        SetLogLevel(LogLevel.value)
    }

    fun Initialize(portNumber: Short): Int {
        return InitializeTcpServer(portNumber)
    }
}

and this is library access class

what should i do ?

and here is the java codes

**`

comValina.java

`**

    package com.posware.comValina;

    public class comValina
    {
        public static boolean NativeLibLoaded = false;

        /* ============================================================================ */
        /*                          NATIVE DLL FUNCTIONS DECLARATION                    */
        /* ============================================================================ */

        /* Parameters */
        public native void SetLogFile(String LogFile);
        private native void SetLogLevel(byte LogLevel);
        public native void SetWaitCardTimeout(byte TimeoutSec);
        public native void SetProductDeliveryTimeout(short TimeoutSec);

        /* Base functions */
        private native int InitializeTcpServer(short PortNumber);
        private native int InitializeRs232(String Device, int speed);
        private native int InitializeRs232KISS(String Device, int speed);
        public native void Close();
        public native String GetVersion();
        private native int GetCurrentState();

        /* Payment functions */
        public native int Payment(int amount);
        public native int Autorisation(int amount);
        public native int Record(int amount);
        public native int Cancel();

        /* Ticket functions */
        private native int GetTicket(int TicketType, String[] OutTicketArray);

        /* Other functions */
        public native int DisplayMenu(int timeoutMs);
        private native int GetAppState(int AppNumber, ComValinaApplicationState AppState);
        private native int ForceAppCall(int appNumber, int callType);

        /* OIDs functions */
        public native int SetOID(String OID, int instance, String value);
        public native int SetOIDInt(String OID, int instance, int value);
        private native int GetOID(String OID, int instance, String[] value, int[] oidType);
        private native int GetOIDInt(String OID, int instance, int[] oidValue);

        /* Transparent command */
        private native int SendCommand(short cmdNumber, String emitBuf, String[] recvBufArray, int timeoutMs);

        /* ============================================================================ */
        /*                              PUBLIC ENUMS                                    */
        /* ============================================================================ */

        /* LogLevel */
        public enum eComValinaLogLevel
        {
            DEBUG_LEVEL_FATAL((byte)0),
            DEBUG_LEVEL_ERROR((byte)1),
            DEBUG_LEVEL_WARNING((byte)2),
            DEBUG_LEVEL_NOTICE((byte)3);

            private byte mValue;
            eComValinaLogLevel(byte Value) { mValue = Value; }
            public byte getValue() { return mValue; }
        }

        /* Terminal state */
        public enum eComValinaState
        {
            COMVALINA_DLL_STATE_NOT_CONNECTED                       (0x00),
            COMVALINA_DLL_STATE_IDLE                                (0x02),
            COMVALINA_DLL_STATE_MAINTENANCE                         (0x04),
            COMVALINA_DLL_STATE_OUT_OF_ORDER                        (0x08),
            COMVALINA_DLL_STATE_PIN_ENTRY                           (0x10),
            COMVALINA_DLL_STATE_DATA_ENTRY                          (0x20),
            COMVALINA_DLL_STATE_REMOVE_CARD                         (0x40),
            COMVALINA_DLL_STATE_CARD_REMOVED                        (0x80),
            COMVALINA_DLL_STATE_CARD_INSERTED                       (0x100),
            COMVALINA_DLL_STATE_CONFIG_CHANGED                      (0x200),
            COMVALINA_DLL_STATE_START_TANKING                       (0x400),
            COMVALINA_DLL_STATE_TANKING_REFUSED                     (0x800),
            COMVALINA_DLL_STATE_TERMINAL_BUSY                       (0x1000),
            COMVALINA_DLL_STATE_BAD_READING                         (0x2000),
            COMVALINA_DLL_STATE_TRANSACTION_STARTED                 (0x4000),
            COMVALINA_DLL_STATE_SLAVE_CARD                          (0x8000),
            COMVALINA_DLL_STATE_PUMP_ENTRY                          (0x10000),
            COMVALINA_DLL_STATE_CARD_READER_IDLE                    (0x20000),
            COMVALINA_DLL_STATE_CARD_READER_OUTOFORDER              (0x40000),
            COMVALINA_DLL_STATE_PRODUCT_ENTRY                       (0x80000),
            COMVALINA_DLL_STATE_INSERT_CARD                         (0x100000),
            COMVALINA_DLL_STATE_AMOUNT_CONFIRMATION                 (0x400000),
            COMVALINA_DLL_STATE_SWIPE_CARD                          (0x800000),
            COMVALINA_DLL_STATE_WAIT_NEXT_CARD                      (0x1000000),
            COMVALINA_DLL_STATE_CURRENCY_SELECTION                  (0x2000000),
            COMVALINA_DLL_STATE_COLLECTION_STARTED                  (0x8000000),
            COMVALINA_DLL_STATE_COLLECTION_ENDED                    (0x10000000),
            COMVALINA_DLL_STATE_COLLECTION_OK                       (0x20000000),
            COMVALINA_DLL_STATE_COLLECTION_ERROR                    (0x40000000),
            COMVALINA_DLL_STATE_UNKNOWN                             (0x80000000);

            private int mValue;
            eComValinaState(int Value) { mValue = Value; }
            public int getValue() { return mValue; }

            /* get state from INT value - return UNKNOWN if not found */
            public static eComValinaState fromValue(int value)
            {
                eComValinaState[] states = eComValinaState.values();
                int i;

                for (i=0; i<states.length; i++)
                {
                    if (states[i].getValue() == value) return states[i];
                }

                /* Not found */
                return COMVALINA_DLL_STATE_UNKNOWN;
            }
        }

        /* Ticket type */
        public enum eComValinaTypeTicket
        {
            COMVALINA_DLL_CUSTOMER_RECEIPT                          (0x01),       /*!<Customer transaction receipt */
            COMVALINA_DLL_MERCHANT_RECEIPT                          (0x02),       /*!<Merchant transaction receipt */

            /* EMV tickets */
            COMVALINA_DLL_EMV_CLEARING_TICKET                       (0x10),       /*!<EMV app clearing ticket */
            COMVALINA_DLL_EMV_TELEPAR_TICKET                        (0x11),       /*!<EMV app telepar ticket */
            COMVALINA_DLL_EMV_DOWNLOAD_TICKET                       (0x12),       /*!<EMV app download ticket */
            COMVALINA_DLL_EMV_CHARACTERISTICS_TICKET                (0x13),       /*!<EMV app hardware and software characteristics ticket */

            /* NFC tickets */
            COMVALINA_DLL_NFC_CLEARING_TICKET                       (0x20),       /*!<NFC app clearing ticket */
            COMVALINA_DLL_NFC_TELEPAR_TICKET                        (0x21),       /*!<NFC app telepar ticket */
            COMVALINA_DLL_NFC_DOWNLOAD_TICKET                       (0x22),       /*!<NFC app download ticket */
            COMVALINA_DLL_NFC_CHARACTERISTICS_TICKET                (0x23);       /*!<NFC app hardware and software characteristics ticket */

            private int mValue;
            eComValinaTypeTicket(int Value) { mValue = Value; }
            public int getValue() { return mValue; }
        }

        /* Application number */
        public enum eComValinaApplicationNumber
        {
            COMVALINA_DLL_APPLICATION_EMV                           (0x01),
            COMVALINA_DLL_APPLICATION_NFC                           (0x02);

            private int mValue;
            eComValinaApplicationNumber(int Value) { mValue = Value; }
            public int getValue() { return mValue; }
        }

        /* Call type */
        public enum eComValinaCallType
        {
            COMVALINA_DLL_CLEARING_CALL                             (0x01),
            COMVALINA_DLL_TELEPAR_CALL                              (0x02);

            private int mValue;
            eComValinaCallType(int Value) { mValue = Value; }
            public int getValue() { return mValue; }
        }

        /* ============================================================================ */
        /*                          APPLICATION STATE                                   */
        /* ============================================================================ */
        public class ComValinaApplicationState
        {
            public short        statusApp;
            public short        statusAsl;
            public byte         ReaderStatus;
            public short        ApplicationState;

            public String       DateTelecol;
            public String       DateTelepar;
            public String       DateTelech;

            /* constructor - default values */
            ComValinaApplicationState()
            {
                statusApp = -1;
                statusAsl = -1;
                ReaderStatus = 0;
                DateTelecol = "";
                DateTelepar = "";
                DateTelech = "";
            }
        }

        /* ============================================================================ */
        /*                              EXCEPTION                                       */
        /* ============================================================================ */
        public class ValinaException extends Exception
        {
            private static final long serialVersionUID = 1L;
            public int errCode;

            ValinaException(int errCode)
            {
                super();
                this.errCode = errCode;
            }
        }

        /* ============================================================================ */
        /*                          CONSTRUCTOR                                         */
        /* ============================================================================ */
        public comValina() throws Exception
        {
            /* Ensure native library is loaded */
            LoadNativeDLL();
        }

        /* ============================================================================ */
        /*                          FUNCTION WRAPPERS                                   */
        /* ============================================================================ */
        public void SetLogLevel(eComValinaLogLevel LogLevel)
        {       
            SetLogLevel(LogLevel.getValue());
        }

        /* Initialize tcp server */
        public int Initialize(short portNumber)
        {   
            return InitializeTcpServer(portNumber);
        }

        /* Initialize, over rs232
         * Please note that non-KISS protocol is deprecated
         */
        public int Initialize(String device, int speed, boolean kissProto)
        {       
            if (kissProto == false) return InitializeRs232(device, speed);
            else return InitializeRs232KISS(device, speed);
        }

        public eComValinaState GetTerminalCurrentState()
        {
            int currentState = this.GetCurrentState();
            return eComValinaState.fromValue(currentState);
        }

        public String GetTicket(eComValinaTypeTicket ticketType) throws ValinaException
        {
            int status;
            int numTicket;
            String[] ticketText = new String[1];

            numTicket = ticketType.getValue();
            status = GetTicket(numTicket, ticketText);

            if (status != 0) throw new ValinaException(status);

            return ticketText[0];
        }

        public ComValinaApplicationState GetAppState(eComValinaApplicationNumber appNumber) throws ValinaException
        {
            int status;
            ComValinaApplicationState outputState = new ComValinaApplicationState();

            status = GetAppState(appNumber.getValue(), outputState);
            if (status != 0) throw new ValinaException(status);

            return outputState;
        }

        public int ForceAppCall(eComValinaApplicationNumber appNumber, eComValinaCallType callType)
        {
            return ForceAppCall(appNumber.getValue(), callType.getValue());
        }

        public String GetOID(String OID, int instance) throws ValinaException
        {
            int[] oidType = new int[1];
            String[] value = new String[1];

            int status = GetOID(OID, instance, value, oidType);
            if (status != 0) throw new ValinaException(status);

            return value[0];
        }

        public int GetOIDInt(String OID, int instance) throws ValinaException
        {
            int[] oidValue = new int[1];

            int status = GetOIDInt(OID, instance, oidValue);
            if (status != 0) throw new ValinaException(status);

            return oidValue[0];     
        }

        public String SendCommand(short cmdNumber, String emitBuf, int timeoutMs) throws ValinaException
        {
            String recvBuf[] = new String[1];

            int status = SendCommand(cmdNumber, emitBuf, recvBuf, timeoutMs);
            if (status != 0) throw new ValinaException(status);

            return recvBuf[0];
        }

        /* ============================================================================ */
        /*                          NATIVE DLL LOADING                                  */
        /* ============================================================================ */

        /* Load native library if not already done
         * Raise exception if failed
         */
        private static void
        LoadNativeDLL() throws Exception
        {
            /* Already loaded ? */
            if (NativeLibLoaded == true) return;

            /* Try to load x86 lib first */
            try
            {
                System.loadLibrary("comValina-x86-java");

                /* if success, job done */
                NativeLibLoaded = true;
                return;
            }
            catch (Exception e)
            {

            }
            catch (UnsatisfiedLinkError ex)
            {
            }

            /* Try to load x64 lib instead */
            try
            {
                System.loadLibrary("comValina-x64-java");

                /* if success, job done */
                NativeLibLoaded = true;
                return;
            }
            catch (Exception e) {}
            catch (UnsatisfiedLinkError ex)
            {

            }

            /* Try to load arm native lib */
            try
            {
                System.loadLibrary("comValina-android-armeabi");

                /* if success, job done */
                NativeLibLoaded = true;
                return;
            }
            catch (Exception e) {}
            catch (UnsatisfiedLinkError ex)
            {

            }

            /* Try to load arm-v7a native lib */
            try
            {
                System.loadLibrary("comValina-android-armeabi-v7a");

                /* if success, job done */
                NativeLibLoaded = true;
                return;
            }
            catch (Exception e) {}
            catch (UnsatisfiedLinkError ex)
            {

            }

            /* Failed to load a working native lib, raise exception */
            throw new Exception("Failed to load native library");
        }
    }
main activity.java
package com.posware.demovalinaandroid;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.posware.comValina.comValina;

public class MainActivity extends AppCompatActivity
{
    private comValina valina;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void cmdInit_OnClick(View view) {
        /* New valina */
        if (valina == null)
        {
            try
            {
                valina = new comValina();
            }
            catch (Exception e)
            {
                Log.e("DemoValina", "Failed to load native library. " + e.getMessage());
                return;
            }
        }

        /* set debug */
        valina.SetLogFile("debug-Valina.txt");
        valina.SetLogLevel(comValina.eComValinaLogLevel.DEBUG_LEVEL_NOTICE);

        /* Initialise terminal, tcp/ip port 2009 */
        int status = valina.Initialize((short) 2009);
        if (status != 0) {
            Toast.makeText(this, "Failed to initialize with err " + status, Toast.LENGTH_SHORT).show();
        } else  {
            Toast.makeText(this, "SUCCESS", Toast.LENGTH_SHORT).show();
        }
    }

    public void cmdPayment_OnClick(View view)
    {
        if (valina == null) return;

        /* Start payment */
        int status = valina.Payment(100);
        if (status == 0) {
            Toast.makeText(this, "Payment succeeded", Toast.LENGTH_SHORT).show();
        } else  {
            Toast.makeText(this, "Payment failed with err " + status, Toast.LENGTH_SHORT).show();
        }
    }
}
android
c++
kotlin
android-ndk
java-native-interface
asked on Stack Overflow Aug 21, 2019 by alkincakiralar • edited Aug 22, 2019 by alkincakiralar

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0