“No implementation found for native…… ”--Jni调用注意事项

当你查了无数资料,历尽千辛万苦,翻越高山大海,终于终于配置好环境,成功生成了库文件(如下图),却发现运行时又报错了!你的心里跑过了多少只草泥马。“No implementation found for native…… ”--Jni调用注意事项_第1张图片

新手在利用Jni调用的时候,很容易遇到的就是LogCat输出:W/dalvikvm(2290): Noimplementation found for native……尤其是复制别人的代码,粘贴到自己的项目中确发现报错了。

当然你也可能连库文件都没有成功生成。


可以从以下几点检查:

1、Android.mk


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include ../OpenCV-SDK/native/jni/OpenCV.mk
LOCAL_SRC_FILES  := ImageProc.cpp
LOCAL_MODULE     := image_proc
include $(BUILD_SHARED_LIBRARY)


注意第三行,“include.. /OpenCV-SDK/native/jni/OpenCV.mk”。一定要换成你自己的路径,例如我的是”D:\software\opencv-android\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk”

注意第五行,这里自己定义的是生成的库的名字,也就是说你可以随便给它取名,当然还是要方便用。要注意的是,java文件中,在你调用本地方法之前,必须加载这个库文件。到时候库的名称一定要对应。例如,你在Android.mk中给库取名为“image_proc”,java中加载成” ImageProc”的话,绝对会报错的。


2.cpp文件

生成的函数名一定要改!


例如

JNIEXPORT jintArray JNICALL Java_com_example_grayprocess_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){
//略
}

函数名称为:Java_包名_类名_方法名如果自己新建一个项目,那么默认的包名会是“com.example.你的项目名”。例如这里的项目名为grayprocess,那么包名是com.example.grayprocess。所以如果是自己新建的项目,复制的别人的代码,那这个函数名是一定要改的!!!


3.h文件是要自己去生成的,ndkEclipse啥啥的都不会自动帮你生成。不要漏了。

.h头文件可以通过jdk提供的工具javah来生成,具体生成方法我就不写了,网上很多。

这里自动生成的头文件中的函数名应该是没有问题的,所以上一步中的函数名,你可以直接复制头文件中的。


















你可能感兴趣的:(android)