2017-11-06 23 views
0

jni @ ndk에 swig wrapper가 있습니다.Android swig 호출 매개 변수의 값이 변경됨

함수 헤더는 다음

// 
// Created by Tomasz on 03/11/2017. 
// 

#ifndef PC_ANDORID_APP_RESIZE_GIF_H 
#define PC_ANDORID_APP_RESIZE_GIF_H 

int Version(); 
int ResizeAnimation(const char * infile, const char * outfile); 

#endif //PC_ANDORID_APP_RESIZE_GIF_H 

통음 계면이 간단하다 :

%module GifResizer 

%inline %{ 
    #include "resize-gif.h" 

    extern int Version(); 
    extern int ResizeAnimation(const char * infile, const char * outfile); 
%} 

및 ResizeAnimation의 구현은 다음

int ResizeAnimation(const char * infile, const char * outfile) { 
    initialize(); 
    /* ... */ 
    return 0; 
} 

문제는 것을 Swig generater wrapper의 params 값 :

SWIGEXPORT jint JNICALL Java_org_imagemagick_GifResizerJNI_ResizeAnimation(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { 
    jint jresult = 0 ; 
    char *arg1 = (char *) 0 ; 
    char *arg2 = (char *) 0 ; 
    int result; 

    (void)jenv; 
    (void)jcls; 
    arg1 = 0; 
    if (jarg1) { 
    arg1 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg1, 0); 
    if (!arg1) return 0; 
    } 
    arg2 = 0; 
    if (jarg2) { 
    arg2 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg2, 0); 
    if (!arg2) return 0; 
    } 
    result = (int)ResizeAnimation((char const *)arg1,(char const *)arg2); 
    jresult = (jint)result; 
    if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1); 
    if (arg2) (*jenv)->ReleaseStringUTFChars(jenv, jarg2, (const char *)arg2); 
    return jresult; 
} 

괜찮 및 ARG1과 ARG2 적절한 값을 가지고 있지만 ResizeAnimation가 호출되면, 포인터가 서로 다른 메모리 주소를 가리킨 OUTFILE (ARG2)은 어떤 임의의 메모리 동안 INFILE (ARG1)은 널이다.

모든 소스는 NDK 용 표준 안드로이드 CMake로 제작되었습니다.

답변

0

x86 에뮬레이터에서 x86_64 코드를 실행하여 문제가 발생했습니다. 바보 :