Android swig调用更改了参数值

时间:2017-11-06 21:55:46

标签: android android-ndk java-native-interface swig

我有一个jni @ ndk的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

swig界面很简单:

%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包装器中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,指针指向不同的内存地址,infile(arg1)为null,而outfile(arg2)是一些随机内存。

所有源代码都是使用标准的android CMake for NDK构建的。

1 个答案:

答案 0 :(得分:0)

问题是由在x86模拟器上运行x86_64代码引起的。傻:)