【问题标题】:C Jni Error in android image pre-image processingandroid图像前图像处理中的C Jni错误
【发布时间】:2013-11-12 06:11:43
【问题描述】:

我正在创建一个库,用于在为 OCR 预处理图像之前检查图像是否模糊。我正在使用代码 sn-p 来执行此操作。当我尝试构建代码时,它显示未定义的引用错误:

 /home/blutech/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-  x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/blur-jni/blur-jni.o: in function Java_com_example_jniblur_ImageBlur_isBlurred:jni/blur-jni.cpp:49: error: undefined reference to 'IsBlurred'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libblur-jni.so] Error 1  

这是我的 Jni 代码:

JNIEXPORT jboolean JNICALL
Java_com_example_jniblur_ImageBlur_isBlurred(
    JNIEnv* env, jclass clazz, jbyteArray input, jint width, jint height) {
  jboolean inputCopy = JNI_FALSE;
  jbyte* const i = env->GetByteArrayElements(input, &inputCopy);

  float blur = 0.0;
  float extent = 0.0;
// cStyle -  reinterpret_cast<uint8*>(i)   env->GetByteArrayElements(input, &inputCopy);
  resetTimeLog();
  int blurred = IsBlurred(reinterpret_cast<uint8*>(i), width, height, &blur, &extent);

  timeLog("Finished image blur detection");
  printTimeLog();

  env->ReleaseByteArrayElements(input, i, JNI_ABORT);

  return blurred ? JNI_TRUE : JNI_FALSE;
}`  

这是我的 c 代码:

    DetectBlur(int* matrix, int width, int height,
    float* blur_conf, float* blur_extent) {
  int nedge = 0;
  int nda = 0;
  int nrg = 0;
  int nbrg = 0;

  // For each scale
  for (int current_scale = kDecomposition; current_scale > 0; --current_scale) {
    int scaled_width = width >> current_scale;
    int scaled_height = height >> current_scale;
    int window_size = 16 >> current_scale;  // 2, 4, 8
    // For each window
    for (int r = 0; r + window_size < scaled_height; r += window_size) {
      for (int c = 0; c + window_size < scaled_width; c += window_size) {
        int k, l;
        int emax = ComputeLocalMaximum(matrix, width, height,
            scaled_width, scaled_height, r, c, window_size, &k, &l);
        if (emax > kThreshold) {
          int emax1, emax2, emax3;
          switch (current_scale) {
            case 1:
              emax1 = emax;
              emax2 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 2);
              emax3 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 3);
              break;
            case 2:
              emax1 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 1);
              emax2 = emax;
              emax3 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 3);
              break;
            case 3:
              emax1 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 1);
              emax2 = ComputeEdgePointWeight(matrix, width, height,
                  k << current_scale, l << current_scale, 2);
              emax3 = emax;
              break;
          }

          nedge++;
          if (emax1 > emax2 && emax2 > emax3) {
            nda++;
          }
          if (emax1 < emax2 && emax2 < emax3) {
            nrg++;
            if (emax1 < kThreshold) {
              nbrg++;
            }
          }
          if (emax2 > emax1 && emax2 > emax3) {
            nrg++;
            if (emax1 < kThreshold) {
              nbrg++;
            }
          }
        }
      }
    }
  }    `

【问题讨论】:

    标签: android c java-native-interface runtime-error undefined


    【解决方案1】:

    IsBlurred(reinterpret_cast&lt;uint8*&gt;(i), width, height, &amp;blur, &amp;extent);

    无论在哪里实现IsBlurred(其他源文件、静态库、共享库),都需要在编译时与你的libblur-jni.so链接。

    查看您的源代码,您有一个名为 DetectBlur 的函数,所以也许您打算调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多