Issue
I am writing an Android application that processes a picture(RAW format) from the native C (NDK r15b). Im getting the following errors:
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xa3f20b80 SpaceTypeMallocSpace begin=0x12c00000,end=0x12e17000,limit=0x2ac00000,size=2MB,capacity=384MB,non_growth_limit_capacity=384MB,name="main rosalloc space"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xa3f1fa80 allocspace main rosalloc space live-bitmap 3[begin=0x12c00000,end=0x2ac00000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xa3f1fac0 allocspace main rosalloc space mark-bitmap 3[begin=0x12c00000,end=0x2ac00000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99b780 SpaceTypeImageSpace begin=0x6fbf5000,end=0x6fcf9288,size=1040KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f1e0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 0[begin=0x6fbf5000,end=0x6fcf9300]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f1e0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 0[begin=0x6fbf5000,end=0x6fcf9300]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99b900 SpaceTypeImageSpace begin=0x6fdf7000,end=0x6fe5f5a8,size=417KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f400 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 1[begin=0x6fdf7000,end=0x6fe5f600]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f400 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 1[begin=0x6fdf7000,end=0x6fe5f600]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99b940 SpaceTypeImageSpace begin=0x6ff12000,end=0x6ff258f8,size=78KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f500 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 2[begin=0x6ff12000,end=0x6ff25900]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f500 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 2[begin=0x6ff12000,end=0x6ff25900]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99ba80 SpaceTypeImageSpace begin=0x6ff3c000,end=0x6ff4b040,size=60KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f640 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 3[begin=0x6ff3c000,end=0x6ff4b100]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f640 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 3[begin=0x6ff3c000,end=0x6ff4b100]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99bbc0 SpaceTypeImageSpace begin=0x6ff66000,end=0x6ff66260,size=608B,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f780 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 4[begin=0x6ff66000,end=0x6ff66300]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f780 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 4[begin=0x6ff66000,end=0x6ff66300]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99bd00 SpaceTypeImageSpace begin=0x6ff68000,end=0x6ff81ad0,size=102KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fcc0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 5[begin=0x6ff68000,end=0x6ff81b00]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fcc0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 5[begin=0x6ff68000,end=0x6ff81b00]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99be40 SpaceTypeImageSpace begin=0x6ffa0000,end=0x6ffb7f58,size=95KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fdc0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 6[begin=0x6ffa0000,end=0x6ffb8000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fdc0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 6[begin=0x6ffa0000,end=0x6ffb8000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99bf80 SpaceTypeImageSpace begin=0x6ffd7000,end=0x702246e0,size=2MB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92ff20 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 7[begin=0x6ffd7000,end=0x70224700]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92ff20 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 7[begin=0x6ffd7000,end=0x70224700]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf99b7c0 SpaceTypeImageSpace begin=0x7058e000,end=0x705dbed8,size=311KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd840 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 8[begin=0x7058e000,end=0x705dbf00]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd840 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 8[begin=0x7058e000,end=0x705dbf00]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92d340 SpaceTypeImageSpace begin=0x7060c000,end=0x7060d520,size=5KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f180 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 9[begin=0x7060c000,end=0x7060d600]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f180 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 9[begin=0x7060c000,end=0x7060d600]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92d380 SpaceTypeImageSpace begin=0x70612000,end=0x70618850,size=26KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd9a0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 10[begin=0x70612000,end=0x70618900]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd9a0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 10[begin=0x70612000,end=0x70618900]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92d4c0 SpaceTypeImageSpace begin=0x7061d000,end=0x7061d118,size=280B,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdaa0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 11[begin=0x7061d000,end=0x7061d200]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdaa0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 11[begin=0x7061d000,end=0x7061d200]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92d600 SpaceTypeImageSpace begin=0x70635000,end=0x70644618,size=61KB,name="/data/dalvik-cache/x86/system@[email protected]"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdba0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 12[begin=0x70635000,end=0x70644700]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdba0 imagespace /data/dalvik-cache/x86/system@[email protected] live-bitmap 12[begin=0x70635000,end=0x70644700]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xa5f3bdc0 SpaceTypeZygoteSpace begin=0x747ca000,end=0x748d2000,size=1056KB,name="Zygote space"]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdca0 allocspace zygote / non moving space live-bitmap 0[begin=0x747ca000,end=0x748d2000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdce0 allocspace zygote / non moving space mark-bitmap 0[begin=0x747ca000,end=0x748d2000]
08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xa3f20a80
The code I run in Java is:
package compresor.app.tfg.compresor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button boton=(Button)findViewById(R.id.button);
boton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
MyNDK myNDK=new MyNDK();
char[] arguments;
arguments= new char[]{' '};
myNDK.compresion(arguments);
}
});
}
}
package compresor.app.tfg.compresor;
public class MyNDK {
static {
System.loadLibrary("ndkmain");
}
public native void compresion(char[] argv);
}
The corresponding native code is:
#include <jni.h>
#include<Principal.h>
#include <compresor_app_tfg_compresor_MyNDK.h>
JNIEXPORT void JNICALL
Java_compresor_app_tfg_compresor_MyNDK_compresion(JNIEnv* env, jobject ,
jobjectArray jargv){
//jargv is a Java array of Java strings
int argc = env->GetArrayLength(jargv);
typedef char *pchar;
pchar *argv = new pchar[argc];
int i;
for (i = 0; i < argc; i++) {
jstring js = (jstring) env->GetObjectArrayElement(jargv, i); //A Java string
const char *pjc = env->GetStringUTFChars(js,NULL); //A pointer to a Java-managed char buffer
size_t jslen = strlen(pjc);
argv[i] = new char[jslen + 1]; //Extra char for the terminating null
strcpy(argv[i], pjc); //Copy to *our* buffer. We could omit that, but IMHO this is cleaner. Also, const correctness.
env->ReleaseStringUTFChars(js, pjc);
}
//Call main
Principal *pa = Principal::CreateInstance(argc, argv);
pa->Run();
pa->FreeInstance();
//Now free the array
for (i = 0; i < argc; i++)
delete[] argv[i];
delete[] argv;
}
I do not understand where the error comes from but it seems to have something to do with the native code that is not well written and I am writing in a part of the inappropriate memory
Thank you in adavance
UPDATE
I have modifier the code with Strings as follows:
package compresor.app.tfg.compresor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button boton=(Button)findViewById(R.id.button);
boton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
MyNDK myNDK = new MyNDK();
String[] arguments = new String[]{"-C","-Qt","1"};
myNDK.compresion(arguments);
}
});
}}
The application quits without giving any error message. The application in C++ works fine, the comprresor generate a file(out.bts) when you give an image, for example image.bmp or image.dng. The parameters on comprresor.exe in C++ are:
compressor.exe -C -Qt 1 -i image.bmp -o out.bts -c config.txt -w 512 -h
512 -b 2.0 -a 0 -Q 0.8 -Xi 0.375 -d 0.5
My Android.mk file looks like:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndkmain
LOCAL_SRC_FILES :=ndkmain.cpp CodificadorAritmetico.cpp cuentasim.cpp
Estima.cpp principal.cpp sb_utils.cpp TBitsContainer.cpp TBitStream.cpp
TFichero.cpp TFormatTransform.cpp TImg_SLTWFloat.cpp TImgCoder.cpp
TQMatrix.cpp TTransformada.cpp totales.cpp
LOCAL_CPP_FEATURES += exceptions
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -lz -lm
LOCAL_LDFLAGS := -Wl,--allow-multiple-definition
include $(BUILD_SHARED_LIBRARY)
and my Application.mk looks like:
APP_MODULES:=ndkmain
APP_ABI := all
APP_STL:=stlport_shared
I am not able to see where the error comes from
Solution
In Java, char[] and String are not synonyms. Your method is defined as compresion(char[] argv), and you do pass char array to it. So, your native code must deal with jchar array, not array of strings:
JNIEXPORT void JNICALL
Java_compresor_app_tfg_compresor_MyNDK_compresion(JNIEnv* env, jobject ,
jcharArray jargv) {
//jargv is a Java array of characters
int argc = env->GetArrayLength(jargv);
jchar *argv = new jchar[argc];
env->GetCharArrayRegion(jargv, 0, argc, argv);
Note that jchar is not C char, but rather uint16_t.
But I guess this little snippet is not what you really wanted.
Most likely, your intention was to pass an array of Java strings. This means that your Java should look different:
MyNDK myNDK = new MyNDK();
String[] arguments = new String[]{"1", "2", "3"};
myNDK.compresion(arguments);
…
public native void compresion(String[] argv);
Now, your C++ code should work.
PS few improvement suggestions:
- If you declare the native method static, you don't need to construct myNDK.
- You can use strdup() instead of new char[] + strcpy.
- You should call env->DeleteLocalRef(js) if argc may be more than just a few.
- You should not perform heavy calculations (e.g. compression) on the UI thread.
- In English, both 'compression' and 'compressor' spell with double s.
Answered By - Alex Cohn
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.