【问题标题】:Android NDK does not react on changeAndroid NDK 对更改没有反应
【发布时间】:2014-03-31 13:18:29
【问题描述】:

我正在实现 Android 相机应用程序,我在 JNI 中处理预览帧。我有 processImage.cpp 文件,我在其中进行所有本机处理,直到现在我发现如果我对本机文件进行任何更改,它不会改变应用程序的行为。

也许它可以连接到我最近添加的OpenCV库的静态链接以及我加载本机库的位置。

package fit.vutbr.faceswap;

// OpenCV static initialization
    static {
        if (!OpenCVLoader.initDebug()) {
            // Handle initialization error
            Log.d(TAG, "OpenCV init error");
        }
        else {
            System.loadLibrary("processImage");
            //System.loadLibrary("detection_based_tracker");
        }
    }

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# OpenCV
OPENCV_LIB_TYPE:=STATIC
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include C:\Users\Acer\Projects\OpenCV\OpenCV-2.4.6-android-sdk\sdk\native\jni\OpenCV.mk

LOCAL_C_INCLUDE:= C:\Users\Acer\Projects\OpenCV\OpenCV-2.4.6-android-sdk\sdk\native\jni\include
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE    := processImage  
LOCAL_SRC_FILES := processImage.cpp 



include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_MODULES := processImage

声明原生方法:

private native int[] kalmanFilterNative(int center_x, int center_y);

在 processImage.cpp 中的定义

jintArray Java_fit_vutbr_faceswap_CameraPreview_kalmanFilterNative( JNIEnv* env, jobject thiz, jint center_x, jint center_y) 
{                   
  // code
  return ret;
}

随叫随到ret = kalmanFilterNative(center_x, center_y); 我得到UnsatisfiedLinkError: Native method not found

有人知道问题出在哪里吗?

【问题讨论】:

  • 可能是现金问题。从项目目录中删除 apk,并从设备中卸载应用程序。
  • 仍然得到:“W/dalvikvm(6553): 未找到本机 Lfit/vutbr/faceswap/CameraPreview 的实现;.kalmanFilterNative:(II)[I”
  • 我遇到过C++构建失败的情况,但是我没有注意到。
  • 我手动运行了ndk-build,结果发现有一个错误。改正后构建完成。但是现在在运行ndk-build 之后,我从 libs 目录中丢失了我的 opencv_java.so (我正在使用上面提到的静态初始化)。是否可以一次构建它们?
  • 好的,问题解决了 :) 我刚刚根据link 编辑了 Android.mk。您能回答我的问题,我会将其标记为已接受吗?

标签: android opencv android-ndk java-native-interface unsatisfiedlinkerror


【解决方案1】:

尝试将您的本地方法修改为:

extern "C" {
    JNIEXPORT jintArray JNICALL Java_fit_vutbr_faceswap_CameraPreview_kalmanFilterNative( JNIEnv* env, jobject thiz, jint center_x, jint center_y);
};
    JNIEXPORT jintArray JNICALL Java_fit_vutbr_faceswap_CameraPreview_kalmanFilterNative( JNIEnv* env, jobject thiz, jint center_x, jint center_y) 
    {                   
      // code
      return ret;
    }

【讨论】:

  • 谢谢,但我忘了在我原来的问题中包含extern "C" {JNIEXPORT ... JNICALL},但我的代码中有这个:) 无论如何我已经解决了,正如你在 cmets 中看到的那样。
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2022-01-25
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多