如何使用Codename One测试Android本机代码段?

时间:2016-11-06 08:40:46

标签: android codenameone

首先,我习惯用Java编程,这就是我使用Codename One开发移动应用程序的原因。

但有时我会看到一些Android格式的代码,我对测试感兴趣。由于Codename one tutorial,我知道如何设置基本的本机界面。

例如,我想测试一下snippet about real time sound processing。但是,它涉及使用此方法中可用的数据(例如onCreate()使用am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);初始化Android this方法中的某些变量,而onCreate()在Codename One Native中具有相同的引用接口。也许我不必使用onCreate()方法(可以be reached from Codename One),但我不是Android大师(也不是CN1)!所以我不知道。

因此,在Codename One原生界面中测试原生Android代码需要做些哪些更改?也许我会很高兴听到一种方法论。

EDIT已解决:本机接口实现中使用的代码

这是original Android code的Codename One本地接口实现。事实上,Android initRecordAndTrack()方法尚未被使用,但在其中初始化的内容已经在this方法中转移,该方法在适合于Codename One的形式时被调用。它使用@akash所述的相同方法,从而将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; }

System.out.println(count(s, ch));

}

非常感谢,

干杯

1 个答案:

答案 0 :(得分:1)

看一下这个链接 https://www.codenameone.com/how-do-i---access-native-device-functionality-invoke-native-interfaces.html

在android this中,通常会引用上下文并访问CN1中的上下文,您可以将this替换为com.codename1.impl.android.AndroidNativeUtil.getActivity()

希望有所帮助