簡體   English   中英

Android(ART)崩潰,錯誤JNI DETECTED ERROR IN APPLICATION:jstring是無效的本地引用

[英]Android (ART) crash with error JNI DETECTED ERROR IN APPLICATION: jstring is an invalid local reference

我正在編寫一個處理本機C(NDK r15b)圖片(RAW格式)的Android應用程序。 我收到以下錯誤:

 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@framework@boot.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f1e0 imagespace /data/dalvik-cache/x86/system@framework@boot.art 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@framework@boot.art 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@framework@boot-core-libart.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f400 imagespace /data/dalvik-cache/x86/system@framework@boot-core-libart.art 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@framework@boot-core-libart.art 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@framework@boot-conscrypt.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f500 imagespace /data/dalvik-cache/x86/system@framework@boot-conscrypt.art 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@framework@boot-conscrypt.art 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@framework@boot-okhttp.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f640 imagespace /data/dalvik-cache/x86/system@framework@boot-okhttp.art 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@framework@boot-okhttp.art 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@framework@boot-core-junit.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f780 imagespace /data/dalvik-cache/x86/system@framework@boot-core-junit.art 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@framework@boot-core-junit.art 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@framework@boot-bouncycastle.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fcc0 imagespace /data/dalvik-cache/x86/system@framework@boot-bouncycastle.art 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@framework@boot-bouncycastle.art 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@framework@boot-ext.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92fdc0 imagespace /data/dalvik-cache/x86/system@framework@boot-ext.art 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@framework@boot-ext.art 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@framework@boot-framework.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92ff20 imagespace /data/dalvik-cache/x86/system@framework@boot-framework.art 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@framework@boot-framework.art 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@framework@boot-telephony-common.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd840 imagespace /data/dalvik-cache/x86/system@framework@boot-telephony-common.art 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@framework@boot-telephony-common.art 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@framework@boot-voip-common.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf92f180 imagespace /data/dalvik-cache/x86/system@framework@boot-voip-common.art 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@framework@boot-voip-common.art 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@framework@boot-ims-common.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fd9a0 imagespace /data/dalvik-cache/x86/system@framework@boot-ims-common.art 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@framework@boot-ims-common.art 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@framework@boot-apache-xml.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdaa0 imagespace /data/dalvik-cache/x86/system@framework@boot-apache-xml.art 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@framework@boot-apache-xml.art 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@framework@boot-org.apache.http.legacy.boot.art"] 08-14 18:08:25.407 6107-6107/compresor.app.tfg.compresor E/art: 0xaf9fdba0 imagespace /data/dalvik-cache/x86/system@framework@boot-org.apache.http.legacy.boot.art 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@framework@boot-org.apache.http.legacy.boot.art 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 

我在Java中運行的代碼是:

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);

     }

相應的本機代碼是:

      #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;




}

我不知道錯誤是從哪里來的,但似乎與編寫得不好的本機代碼有關,我正在寫不適當的內存的一部分

謝謝你

UPDATE

我用String修改了代碼,如下所示:

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);



        }
    });

        }}

該應用程序退出而沒有給出任何錯誤消息。 C ++中的應用程序運行良好,當您提供圖像(例如image.bmp或image.dng)時,編譯器會生成一個文件(out.bts)。 C ++中的comprresor.exe的參數為:

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

我的Android.mk文件如下所示:

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)

我的Application.mk看起來像:

APP_MODULES:=ndkmain
APP_ABI := all
APP_STL:=stlport_shared

我無法看到錯誤的來源

在Java中, char []String不是同義詞。 您的方法定義為compresion(char [] argv) ,您確實將char數組傳遞給了它。 因此,您的本機代碼必須處理jchar數組,而不是字符串數組:

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); 

請注意, jchar不是C char ,而是uint16_t

但是我想這不是您真正想要的片段。

您最有可能的意圖是傳遞一組Java字符串。 這意味着您的Java應該看起來與眾不同:

MyNDK myNDK = new MyNDK();
String[] arguments = new String[]{"1", "2", "3"};

myNDK.compresion(arguments);
…
public native void compresion(String[] argv);

現在, 您的 C ++代碼應該可以使用了。

PS幾點改進建議:

  • 如果將本地方法聲明為靜態 ,則無需構造myNDK
  • 您可以使用strdup()代替new char [] + strcpy
  • 如果argc可能不止幾個,則應調用env-> DeleteLocalRef(js)
  • 您不應該在UI線程上執行繁重的計算(例如壓縮)。
  • 用英語,“ compression”和“ compressor”都用double s拼寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM