OpenCV Android(安卓)通过 jni调用 使用opencv (Android(安卓)Studio)
工具环境:
Android Studio 2.2
OpenCV-android-sdk 3.0.0
步骤:
新建工程:
一路默认设置,Next
创建完成:
导入module (opencv4android library, 下载的opencv-android-sdk解压目录下的\sdk\java)
新建JNI目录(是在app\scr\main这一层下面新建)
复制native文件夹
MainActivity复制内容
public class MainActivity extends AppCompatActivity { private Button btn; private ImageView img; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { btn= (Button) findViewById(R.id.btn); img= (ImageView) findViewById(R.id.img); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable( R.drawable.ic)).getBitmap(); int w = bitmap.getWidth(), h = bitmap.getHeight(); int[] pix = new int[w * h]; bitmap.getPixels(pix, 0, w, 0, 0, w, h); int [] resultPixes=OpenCVHelper.gray(pix,w,h); Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565); result.setPixels(resultPixes, 0, w, 0, 0,w, h); img.setImageBitmap(result); } }); }}
会有报错:
设置模块引用
剩下的报错,替换res里面的文件, 复制到对应路径
再新建文件: OpenCVHelper
public class OpenCVHelper { static { System.loadLibrary("OpenCV"); } public static native int[] gray(int[] buf, int w, int h);}
下面是jni文件夹里面的内容:
复制android.mk和application.mk
文件内容如下:
android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OpenCV_INSTALL_MODULES := onOpenCV_CAMERA_MODULES := offOPENCV_LIB_TYPE := STATICifeq ("$(wildcard $(OPENCV_MK_PATH))","")include ..\..\..\..\native\jni\OpenCV.mkelseinclude $(OPENCV_MK_PATH)endifLOCAL_MODULE := OpenCVLOCAL_SRC_FILES := cn_edu_zafu_opencv_OpenCVHelper.cppLOCAL_LDLIBS += -lm -lloginclude $(BUILD_SHARED_LIBRARY)
application.mk
APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := x86_64APP_PLATFORM := android-9
这里的x86_64是在电脑模拟器上的,如果是android手机上,需要改成armeabi-v7a
.h文件是通过javah新建的( 见http://blog.csdn.net/yu544324974/article/details/51821853 )
gradle的配置:
根目录下的gradle.properties文件,增加一行:
android.useDeprecatedNdk=true
local.properties设置路径
app目录下的build.gradle文件
android节点下,添加
sourceSets.main.jni.srcDirs = [] //禁止自带的ndk功能 sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs'] //重定向so目录为src/main/libs,原来为src/main/jniLibs task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = properties.getProperty('ndk.dir') if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) { commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath } else { commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath } } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } task ndkClean(type: Exec, description: 'Clean NDK Binaries') { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = properties.getProperty('ndk.dir') if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) { commandLine "$ndkDir/ndk-build.cmd",'clean', '-C', file('src/main/jni').absolutePath } else { commandLine "$ndkDir/ndk-build",'clean', '-C', file('src/main/jni').absolutePath } } clean.dependsOn 'ndkClean'
externalNativeBuild 的节点删除掉配置文件完成以后, 执行ndk-build
编译遇到这个报错:
Error:Execution failed for task ':app:ndkBuild'.
> Process 'command 'D:\env\android\android-ndk-r13/ndk-build.cmd'' finished with non-zero exit value 2
是因为android.mk里面 LOCAL_SRC_FILES 的配置的错误
可以通过命令行执行d:\env\android\android-ndk-r13\ndk-build.cmd -C src/main/jni进行调试
选择app,然后编译运行
效果:
更多相关文章
- Android(安卓)N调用系统安装APK方法报错原因整理及解决方案
- 【转】android progressbar 自定义样式
- Flutter Android(安卓)Studio打包安卓apk文件
- Android系统开发之七:添加Android(安卓)Native Service方法
- Android(安卓)文件操作之openFileOutput
- android studio 新建class文件报错Unable to parse template "Cl
- android studio 导入自定义编码格式
- To Do List
- AndroidStudio Frameworks detected: Android(安卓)framework is