JNI静态(static)载入OpenCV

本文地址: http://blog.csdn.net/caroline_wendy

步骤:

1. 准备OpenCV-Android库

复制OpenCV的sdk至工作目录.

下载OpenCV的最新android-sdk: OpenCV-2.4.9-android-sdk;

把当中的sdk目录, 复制到工作目录; sdk目录里包括native, java, etc. 三个目录.

2. 载入OpenCV-Android库

导入(import)工作目录的java目录, 设置为当前项目的库.

[项目名]右键点击->Android->Add Library->选择加入的库. 就可以. 不须要选择Is Library.

3. 创建JniClient类.

包括须要使用的方法(method), 能够多个.

/**
*
*/
package com.example.hellomyjni; /**
* @author Administrator
*
*/
public class JniClient {
static public native String sayName();
static public native int[] grayImage(int[] pixels, int w, int h);
}

使用命令行, 生成头文件.

进入项目目录, 生成JNI的头文件, 使用命令:

"javah -classpath bin/classes -d jni com.example.hellomyjni.JniClient"

或javah -classpath D:/eclipse-android/android-sdk/platforms/android-17/android.jar;bin/classes -d jni com.example.mycamera.CartoonifierView

包括Android库.

命令解析:

javah 生成头文件;

-classpath 使用类的位置(bin/classes), 都是.class文件;

-d jni 须要生成JNI的类(com.example.hellomyjni.JniClient), 包括[package].[classname].

其余參考: http://blog.csdn.net/caroline_wendy/article/details/39032551

4. 改动JNI配置文件

须要在jni目录内创建Application.mk, 主要负责C++标准的使用(APP_STL), 和须要编译的库.

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

改动Android.mk, 不须要使用OPENCV_LIB_TYPE:=STATIC

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on include C:/Users/Administrator/android-workspace/opencv-sdk/native/jni/OpenCV.mk LOCAL_MODULE := HelloMyJni
LOCAL_SRC_FILES := HelloMyJni.cpp
LOCAL_LDLIBS += -llog -ldl
#LOCAL_C_INCLUDES += ./
LOCAL_SRC_FILES += ./sayname.cpp include $(BUILD_SHARED_LIBRARY)

5. JNI函数

#include <jni.h>
#include <opencv2/opencv.hpp> using namespace cv; #include "com_example_hellomyjni_JniClient.h" #include "sayname.h" JNIEXPORT jstring JNICALL Java_com_example_hellomyjni_JniClient_sayName
(JNIEnv *env, jclass) {
string str = sayname();
return env->NewStringUTF(str.c_str());
} JNIEXPORT jintArray JNICALL Java_com_example_hellomyjni_JniClient_grayImage
(JNIEnv *env, jclass, jintArray buf, jint w, jint h ) { jint *cbuf;
cbuf = env->GetIntArrayElements(buf, false);
if (cbuf == NULL) {
return 0;
} Mat imgData(h, w, CV_8UC4, (unsigned char*) cbuf); uchar* ptr = imgData.ptr(0);
for (int i = 0; i < w * h; i++) {
int grayScale = (int) (ptr[4 * i + 2] * 0.299 + ptr[4 * i + 1] * 0.587
+ ptr[4 * i + 0] * 0.114);
ptr[4 * i + 1] = grayScale;
ptr[4 * i + 2] = grayScale;
ptr[4 * i + 0] = grayScale;
} int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}

在项目中加入OpenCV头文件的检查, 能够避免文件报错.

6. 改动MainActivity

调用JNI的函数.

package com.example.hellomyjni;

import org.opencv.android.OpenCVLoader;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView; public class MainActivity extends Activity{ private ImageView iv;
private Bitmap bmp; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.text_view); tv.setText(JniClient.sayName()); //recall JNI iv = (ImageView) findViewById(R.id.image_view);
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.shoes);
int w = bmp.getWidth();
int h = bmp.getHeight();
int[] pixels = new int[w * h];
bmp.getPixels(pixels, 0, w, 0, 0, w, h); int[] resultInt = JniClient.grayImage(pixels, w, h); //recall JNI Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);
resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
iv.setImageBitmap(resultImg); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} static {
if (!OpenCVLoader.initDebug()) {
} else {
System.loadLibrary("HelloMyJni");
}
}
}

7. 输出

Android - JNI静态(static)载入OpenCV的更多相关文章

  1. Android开发 静态static类与static方法持有Context是否导致内存泄露的疑问

    简述 在Android开发的过程中,难免会使用单例模式或者静态方法工具类.我们会让它们持有一些外部的Context或者View一般有以下几种情况: 单例模式,类的全局变量持有Context 或 Vie ...

  2. android JNI 简单demo(2)它JNI demo 写

    android JNI 简单demo(2)它JNI demo 写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25 ...

  3. Android执行时ART载入类和方法的过程分析

    在前一篇文章中.我们通过分析OAT文件的载入过程,认识了OAT文件的格式,当中包括了原始的DEX文件. 既然ART运行时运行的都是翻译DEX字节码后得到的本地机器指令了.为什么还须要在OAT文件里包括 ...

  4. [转载]—— Android JNI知识点

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  5. android JNI调用(转)

    Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...

  6. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  7. 【转】android JNI

    原文网址:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码 ...

  8. android jni ——Field & Method --> Accessing Field

    现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调ja ...

  9. android jni——helloworld

    看了网上好多牛人写的学习系列都是用HelloWorld作为开始,我们这里也用HelloWorld来开始我们的学习,首先我们来介绍下JNI吧. JNI作为java代码和C/C++的桥梁而存在的,为了让j ...

随机推荐

  1. Ch03 视图基础

    3.1  视图简介 3.1.1  选择待渲染视图 3.1.2  重写视图名 3.2  给视图传递数据 3.2.1  ViewDataDictionary 3.2.2  ViewBag 3.2.3  带 ...

  2. WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构)

    LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); Parameters wParam ...

  3. 设计模式模式适配器(Adapter)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...

  4. HTML+CSS - 搜索 And 高级搜索

  5. 文本面板——axure线框图部件库介绍

    文本部件用于在页面中显示文字,对于文字的格式可以随意的更改,设定不同的字体.尺寸和颜色. 特别注意:文本面板的高度无法直接调整,它的高度是随着字体的大小自动变化的 在6.5版本中,对文本的排版都有2个 ...

  6. Spring Configuration Check Unmapped Spring configuration files found

    Spring Configuration Check Unmapped Spring configuration files found 项目中有xml文件,但没有被用IntelliJ 导入现有工程时 ...

  7. 基于visual Studio2013解决面试题之0510连续数之和

     题目

  8. 不容错过的UI设计素材大合集

    免费PSD素材 TETHR by InVision 这是出自InVision的8款PSD文件,其中包含了100个模板和超过500个UI控件.来自InVision和UI8的设计师一同协作完成了这套UI ...

  9. smartforms换页,

    smartforms换页,可以把最后的窗口设置成最终窗口, 这样页码有可以用系统变量控制: 总页码/页码 :&SFSY-FORMPAGES&

  10. 进阶:案例六: Context Menu(静态 与 动态)

    实现: 1.add: 2.delete 3.add2 实现步骤: 1.新建属性display_text 2.创建layout 3.代码部分: add事件: METHOD onactionadd . D ...