Hi guys, Still stuck, but some relevant details have changed that may help answer my question. So I'm trying to implement a sink block for gnuradio-android that takes integers on its input (not chars as I had erroneously written before) and stores the last 'length' items in a LIFO buffer; the buffer's contents are written to an Android TextView object every time the block's work function is called. Following is the constructor I have written in order to pass this block the JNIEnv and jobject variables it needs in order to access the methods of my TextView instance:
stream_to_tv_sink_impl::stream_to_tv_sink_impl(JNIEnv *env, jobject jtv, int length) : gr::sync_block("stream_to_tv_sink", gr::io_signature::make(1, 1, sizeof(int), gr::io_signature::make(0, 0, 0)), d_env(env), d_jtv(jtv), d_length(length) { d_buffer = new string[length]; for(int i = 0; i < length; i++) { d_buffer[i] = "0"; } d_output = "Nothing yet..."; jclass d_cls = env->GetObjectClass(jtv); jmethodID d_mid = env->GetMethodID(d_cls, "setText", "(Ljava/lang/CharSequence;)V"); } And here is my work function: int stream_to_tv_sink_impl::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const int *in = (const int *) input_items[0]; // Update LIFO for(int i = d_length - 1; i > 0; i--) { d_buffer[i] = d_buffer[i-1]; } d_buffer[0] = to_string(in[0]); // Construct output string, newest >> oldest (left to right) d_output = d_buffer[0]; for(int i = 1; i < d_length; i++) { d_output += " " + d_buffer[i]; } // Display output string -- Invoke setText method d_env->CallVoidMethod(d_jtv, d_mid, d_env->NewStringUTF(d_output.c_str())); // Might need to do this j times for j < noutput_items // Tell runtime system how many output items we produced. return noutput_items; } Where I am stuck is I cannot figure out how to come up with the appropriate makefile (using cmake or otherwise) to build this block into a prebuilt static library so that I may use it in my Android flowgraph, as shown for example in the instructions for building GNU Radio for Android and GRAnd at https://gnuradio.org/redmine/projects/gnuradio/wiki/GRAndBuild. I don't have much experience tinkering with cmake but I've been looking over the cmake files in GRAnd and the android fork of gnuradio and I can't figure out how to properly link to the JNI library to build this thing -- or if statically linking to JNI types and methods in this manner is even possible. If it isn't, I'm open to suggestions for alternative methods of displaying the flowgraph's end results in my Android app; at the moment my flowgraph terminates in a file sink, and the app reads/displays a few entries from the file, but this not a good solution for when the flowgraph is running for more than 10 or 15 seconds. Any advice appreciated, Vijay -----Original Message----- From: discuss-gnuradio-bounces+vijayg=sfu...@gnu.org [mailto:discuss-gnuradio-bounces+vijayg=sfu...@gnu.org] On Behalf Of Vijay Galbaransingh Sent: March-21-15 00:51 To: 'Tom Rondeau' Cc: 'GNURadio Discussion List' Subject: Re: [Discuss-gnuradio] GNU Radio on Android Hi guys, I am attempting to write an OOT module to be implemented on Android and am finding myself out of my depth here. As a first step I was able to make and execute my flowgraph on my android device following the instructions on the wiki, using a file sink to store my end result (demodulated string.) Now I would like to create my own sink which takes char inputs and updates a TextView object as they are ‘spat out’ by the flowgraph. I followed the general instructions on the wiki for coding an OOT module/object, so gr_modtool generated all the boiler plate code and I have modified it accordingly. Where I am hitting an issue is that I must pass JNIEnv* and jobject arguments to my make (hence impl) functions in order to interact with the TextView object in my work function… but when I try to build the module I get the following error for example: “error: 'JNIEnv' has not been declared”, and similarly for all the jobject, jclass, and jmethodID occurrences. It would seem make doesn’t know how to find the JNI libraries (and I’m guessing volk is missing too,) and I’m unsure how to tell it where to look. Any thoughts? Or is there a smarter / less roundabout way altogether to display my flowgraph output in my Android activity? Thanks, Vijay From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of Tom Rondeau Sent: March-19-15 07:36 To: Vijay Galbaransingh Cc: GNURadio Discussion List Subject: Re: [Discuss-gnuradio] GNU Radio on Android On Thu, Mar 19, 2015 at 3:28 AM, Vijay Galbaransingh <vij...@sfu.ca> wrote: Tom, As you expected, disabling buffering on the file sink did not have any effect. I have fixed the issue though by making two changes to opensl_source_impl.cc: 1) change scale_factor to 32768 (1/2^14 doesn't make sense, it causes clipping because the volk conversion method divides by scale_factor.) 2) change buffer size (d_size) to 8k (2k was too small, tested 32/44.1/48kHz on Nexus 4 and Nexus 7 2012 version.) Without this change the recorded audio will be very choppy (dropped samples?) Vijay Ah, ok, that makes sense. I think I was just playing around with those parameters and must have checked them in at that state. I'll make those updates to the repo. Thanks. Tom From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of Tom Rondeau Sent: March-18-15 07:11 To: Vijay Galbaransingh Cc: GNURadio Discussion List Subject: Re: [Discuss-gnuradio] GNU Radio on Android On Wed, Mar 18, 2015 at 1:46 AM, Vijay Galbaransingh <vij...@sfu.ca> wrote: Tom, What kind of sample rate / setup are you using for your opensl_source? I've set up a flowgraph that is just an opensl_source (sampling at 48kHz) connected to a file sink, and when I play back the file through GRC on my desktop my audio is coming out pretty garbled, as if samples are being dropped. I've also tried a couple other sampling rates (44.1kHz, 32kHz, 16kHz to name a few.) I'm using a Nexus 4 running Android 5.0.1. Pasted below is some of my code. Vijay Flowgraph code: JNIEXPORT void JNICALL Java_com_example_grrecordmic_GrRecordMic_InitFlowgraph(JNIEnv* env, jobject thiz, jstring jsinkfilename) { int rate = 48000; const char *sinkfilename = env->GetStringUTFChars(jsinkfilename, 0); global_tb = gr::make_top_block("Record_Mic"); gr::grand::opensl_source::sptr micSource = gr::grand::opensl_source::make(rate); gr::blocks::file_sink::sptr fileSink = gr::blocks::file_sink::make(sizeof(float), sinkfilename, false); global_tb->connect(micSource, 0, fileSink, 0); env->ReleaseStringUTFChars(jsinkfilename, sinkfilename); } I believe that I used either 32k and/or 44.1k. I was using a Nexus 7, though, and the codec might play a significant role with this between the two devices. Perhaps try setting the file sink to unbuffered mode? fileSink->set_unbuffered(true); Frankly, I feel like this is unlikely to help, but it'll be interesting to know what happens. Tom From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of Tom Rondeau Sent: March-17-15 07:37 To: Vijay Galbaransingh Cc: GNURadio Discussion List Subject: Re: [Discuss-gnuradio] GNU Radio on Android On Tue, Mar 17, 2015 at 12:10 AM, Vijay Galbaransingh <vij...@sfu.ca> wrote: Thanks Tom, that sorted it out. My audio output is a bit choppy but no matter – time to move on to some more complex flowgraphs in my Android app. Thanks again, Vijay Yes, the skipping in the audio output is a known bug, and apparently known to be difficult in Android. It's going to take some kind of double buffering to fix it at this level. I did not experience any problems with the audio source, though; I just saved it to a file, brought it back to my computer, and played it there and it sounded fine. Tom From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of Tom Rondeau Sent: March-16-15 06:37 To: Vijay Galbaransingh Cc: GNURadio Discussion List Subject: Re: [Discuss-gnuradio] GNU Radio on Android On Mon, Mar 16, 2015 at 3:28 AM, Vijay Galbaransingh <vij...@sfu.ca> wrote: Hi Tom, I have been following your notes on the wiki in an attempt to build a test app (a dial tone flowgraph.) I'm hitting a snag on the ndk-build step though -- when I use your example Android.mk listing, the linker isn't finding any of the static libraries we built (gnuradio, grand, boost, fftw.) Instead I'm getting a pile of undefined reference errors. I tried editing the example Android.mk file by adding the following before the shared library build: include $(CLEAR_VARS) LOCAL_MODULE := grand_static_lib #for example LOCAL_SRC_FILES := /opt/grandroid/lib/libgnuradio-grand.a include $(PREBUILT_STATIC_LIBRARY) However I quickly realised that while there are only a few gnuradio libraries to add this way, there are a ton of boost libraries... Is there a smarter way to add all the prebuilt .a libraries at once? Or am I headed in the wrong direction entirely? Any tips appreciated, Vijay Yep, you have to add all of the libraries into the Android.mk file. I've updated the wiki: http://gnuradio.org/redmine/projects/gnuradio/wiki/GRAndApps You can go there and simply download GrAndroid.mk that does all of this for you and include it in your Android.mk file. Just follow the instructions. Hope that helps, Tom From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of Tom Rondeau Sent: March-13-15 14:41 To: Vijay Galbaransingh Cc: GNURadio Discussion List Subject: Re: [Discuss-gnuradio] GNU Radio on Android On Fri, Mar 13, 2015 at 5:04 PM, Vijay Galbaransingh <vij...@sfu.ca> wrote: Hi, Has a patched version of GNU Radio which runs on Android been released? I'm working on a project where I'm transmitting information over audio from a desktop system to an Android device, and since setting up the transmitter end with GNU Radio was such a snap I would love to leverage the GNU Radio system to build the receiver as well. Thanks, Vijay Just yesterday, in fact: http://gnuradio.org/redmine/projects/gnuradio/wiki/Android I'll try to release some of my apps soon. One of them captures from the audio device, even. It's not too hard since there's the gr-grand opensl audio source block to talk to the audio system. Tom _______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio _______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio