потоки отключаются после вызова нативного вызова - PullRequest
0 голосов
/ 23 марта 2012

хорошо, поэтому мой java-код:

private static native void setNativeFiles(mFileDescriptor[] r);
public void setFiles(mFileDescriptor[] files){
    setNativeFiles(files);
}

static class mFileDescriptor{
    private FileDescriptor fd;
    private long offset;
    private long size;

    public FileDescriptor getFd() {
        return fd;
    }
    public void setFd(FileDescriptor fd) {
        this.fd = fd;
    }
    public long getOffset() {
        return offset;
    }
    public void setOffset(long offset) {
        this.offset = offset;
    }
    public long getSize() {
        return size;
    }
    public void setSize(long size) {
        this.size = size;
    }
}

mFileDescriptor является внутренним классом между прочим ...

мой код c:

void Java_com_ultrasound_JNIinterface_setNativeFiles(JNIEnv* env, jclass mclass, jobjectArray arr){
LOGI("Setting Native files");
jclass filedescriptor = env->FindClass("com/ultrasound/JNIinterface/mFileDescriptor");
int length = env->GetArrayLength(arr);
for(int index = 0; index < length; index++)
{
    //jclass mvclass = env->GetObjectClass(obj);
    jmethodID mid = env->GetMethodID(filedescriptor, "getFd", "()Ljava/io/FileDescriptor;");
    jobject temp = env->CallObjectMethod( arr, mid);
    int mvdata0 = reinterpret_cast<int>(&temp);

    mid = env->GetMethodID(filedescriptor, "getOffset", "()L");
    temp = env->CallObjectMethod( arr, mid);
    long mvdata1 = reinterpret_cast<long>(&temp);

    mid = env->GetMethodID(filedescriptor, "getSize", "()L");
    temp = env->CallObjectMethod( arr, mid);
    long mvdata2 = reinterpret_cast<long>(&temp);

    mFileDescriptor * fp;
    switch(index){
    case 0:
        fp = &ch0Descript;
        fp->fd = mvdata0;
        fp->offset = mvdata1;
        fp->size = mvdata2;
        break;
    case 1:
        fp = &ch1Descript;
        fp->fd = mvdata0;
        fp->offset = mvdata1;
        fp->size = mvdata2;
        break;
    case 2:
        fp = &ch2Descript;
        fp->fd = mvdata0;
        fp->offset = mvdata1;
        fp->size = mvdata2;
        break;
    default:
        LOGE("Native file indexing failed");
    }
}
LOGI("Native files set");

}

всякий раз, когда я вызываю setFiles, я получаю это:

03-23 00:13:11.080: I/(9879): Setting Native files
03-23 00:13:11.080: I/(9879): Right before loop
03-23 00:13:11.080: I/(9879): IN FOR LOOP
03-23 00:13:11.501: W/ActivityManager(175): Activity pause timeout for HistoryRecord{406814b8 com.ultrasound/.UltraSoundJNIActivity}
03-23 00:13:12.241: W/dalvikvm(9879): threadid=10: spin on suspend #1 threadid=1 (pcf=0)
03-23 00:13:12.982: W/dalvikvm(9879): threadid=10: spin on suspend #2 threadid=1 (pcf=0)
03-23 00:13:12.982: I/dalvikvm(9879): "Thread-10" prio=5 tid=10 RUNNABLE
03-23 00:13:12.982: I/dalvikvm(9879):   | group="main" sCount=0 dsCount=0 obj=0x40651440 self=0x136c48
03-23 00:13:12.982: I/dalvikvm(9879):   | sysTid=9892 nice=0 sched=0/0 cgrp=default handle=1279040
03-23 00:13:12.982: I/dalvikvm(9879):   | schedstat=( 1495360 488283 24 )
03-23 00:13:12.982: I/dalvikvm(9879):   at com.ultrasound.JNIinterface$1.run(JNIinterface.java:~31)
03-23 00:13:12.982: I/dalvikvm(9879):   at java.lang.Thread.run(Thread.java:1019)
03-23 00:13:12.982: I/dalvikvm(9879): "main" prio=5 tid=1 RUNNABLE
03-23 00:13:12.982: I/dalvikvm(9879):   | group="main" sCount=1 dsCount=0 obj=0x40161190 self=0xce68
03-23 00:13:12.982: I/dalvikvm(9879):   | sysTid=9879 nice=0 sched=0/0 cgrp=default handle=-1345002432
03-23 00:13:12.982: I/dalvikvm(9879):   | schedstat=( 64514163 45135496 61 )
03-23 00:13:12.992: I/dalvikvm(9879):   at com.ultrasound.JNIinterface.setNativeFiles(Native Method)
03-23 00:13:12.992: I/dalvikvm(9879):   at com.ultrasound.JNIinterface.setFiles(JNIinterface.java:105)
03-23 00:13:12.992: I/dalvikvm(9879):   at com.ultrasound.UltraSoundJNIActivity.onCreate(UltraSoundJNIActivity.java:59)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.ActivityThread.access$1500(ActivityThread.java:123)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.os.Handler.dispatchMessage(Handler.java:99)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.os.Looper.loop(Looper.java:130)
03-23 00:13:12.992: I/dalvikvm(9879):   at android.app.ActivityThread.main(ActivityThread.java:3835)
03-23 00:13:12.992: I/dalvikvm(9879):   at java.lang.reflect.Method.invokeNative(Native Method)
03-23 00:13:12.992: I/dalvikvm(9879):   at java.lang.reflect.Method.invoke(Method.java:507)
03-23 00:13:12.992: I/dalvikvm(9879):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-23 00:13:12.992: I/dalvikvm(9879):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-23 00:13:12.992: I/dalvikvm(9879):   at dalvik.system.NativeStart.main(Native Method)
03-23 00:13:13.743: W/dalvikvm(9879): threadid=10: spin on suspend #3 threadid=1 (pcf=0)
03-23 00:13:13.743: I/dalvikvm(9879): "Thread-10" prio=5 tid=10 RUNNABLE

, что в конечном итоге приводит к "Фатальному вращению при приостановке: сброс потоков"

Я думаю, что это вызов getObjectMethod, так как я положилВойдите прямо перед циклом for и после первых данных.Любая помощь ??

1 Ответ

1 голос
/ 23 марта 2012

Ваш код имеет несколько проблем:

  1. com/ultrasound/JNIinterface/mFileDescriptor -> com/ultrasound/JNIinterface$mFileDescriptor

  2. Кусок кода, который бросает адрес (!)задания, возвращенного из getFd в long, просто неверно

  3. ()L в getOffset и getSize методы должны быть ()J

  4. CallLongMethod должно использоваться вместо CallObjectMethod

  5. temp не требуется, результат CallLongMethod должен быть присвоен непосредственно mvdata переменным (которыедолжен быть типа jlong)

...