HelloWorld
HelloWorld

Reputation: 2355

How to test an Android native code snippet with Codename One?

First off I am used to programming with Java that's why I am using Codename One to develop mobile applications.

However sometimes I see some code in Android "format" that I am interested on testing. I know how to set up basic native interface thanks to Codename one tutorial.

For example, I would like to test this snippet about real time sound processing. However it involves initializing some variable in the Android onCreate() method with data that is available in this method such as am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); with the use of this which has not the same reference in the Codename One Native Interface. Maybe I don't have to use the onCreate() method (which could be reached from Codename One) but I am not an Android guru (nor a CN1 one either!), so I don't know.

Consequently what changes do I have to make to test native Android code in Codename One native interface ? Maybe there is a methodology that I would be glad to hear of.

EDIT SOLVED : Code used in the native interface implementation that works

Here is the Codename One native interface implementation of the original Android code. Indeed Android onCreate() method has not been used but the things that were initialized in it have been transfered in the initRecordAndTrack() method which is called when suited in the Codename One's form. It uses the same method as described below by @akash thus replacing this by com.codename1.impl.android.AndroidNativeUtil.getActivity().

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import android.content.Context;

public class KestudisNativeInterfaceImpl {

boolean isRecording = false;
AudioManager am = null;
AudioRecord record = null;
AudioTrack track = null;

public void initRecordAndTrack() {
    android.app.Activity ctx = com.codename1.impl.android.AndroidNativeUtil.getActivity();

    am = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
    am.setSpeakerphoneOn(true);
    int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
    record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
            min);
//    if (AcousticEchoCanceler.isAvailable())
//    {
//        AcousticEchoCanceler echoCancler =  AcousticEchoCanceler.create(record.getAudioSessionId());
//        echoCancler.setEnabled(true);
//    }
    int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
    track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter,
            AudioTrack.MODE_STREAM);

    (new Thread() {
        @Override
        public void run() {
            recordAndPlay();
        }
    }).start();
}

public void startRecordAndPlay() {
    record.startRecording();
    track.play();
    isRecording = true;
}

public void stopRecordAndPlay() {
    record.stop();
    track.pause();
    isRecording = false;
}

private void recordAndPlay() {
    short[] lin = new short[1024];
    int num = 0;
    am.setMode(AudioManager.MODE_IN_COMMUNICATION);
    while (true) {
        if (isRecording) {
            num = record.read(lin, 0, 1024);
            track.write(lin, 0, num);
        }
    }
}

public boolean isSupported() {
    return true;
}

}

Thanks a lot,

Cheers

Upvotes: 1

Views: 235

Answers (1)

akash kubavat
akash kubavat

Reputation: 847

Have a look at this link https://www.codenameone.com/how-do-i---access-native-device-functionality-invoke-native-interfaces.html

In android this normally refer to context and to access context in CN1 you can replace this with com.codename1.impl.android.AndroidNativeUtil.getActivity()

hope that helps

Upvotes: 1

Related Questions