First, the passing parameters from Java level to native code are using time to convert and if you use JNI so often then that gonna be heavy load.
Second, you need to allocate/deallocate resources by yourself in native level(there is no garbage collector in C/C++ ) and that takes time to do anyway.
Ok. Here are tricks and tips for speed up your Android JNI app. Hope it works for you too ...
1. allocate/deallocate just one
The bigger memory you need, the slower you are. So, if it's possible. Try to do allocate and release the resources just one time.
Check you code that you really need that much resource? Just use that it needs to be run properly.
for example, data = (unsigned char *)malloc( BLOCKSIZE + 100 );
May be +100 is not necessary.
3. don't use double
I don't know why but in native code, double makes slow. I changed it type to normal "int" and it running a lot faster.(make sure it doesn't make wrong result)
4. set MAX priority to the thread
I found that when garbage collector thread is running, some delay may occur(not much but it does go slower) So, try to set your JNI caller thread's priority to MAX that will (somehow) prevent garbage collector thread to run during JNI call.
5. try "ARM" mode
In your Android.Mk file, add LOCAL_ARM_MODE := arm line and rebuild the code. I found out that the default Thumb mode is slower than Arm mode. However, I'm not sure that it gonna be true for all device.
That is for today !! and may the Force be with you all :D