linux2.4 静态加载,Android - JNI静态(static)加载OpenCV

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

#include

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头文件的检查, 可以避免文件报错.

230efa4765dba3946e7b569ec7298072.png

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. 输出

e207512556771f0b4b5a9758fcfef288.png

59cc967e91b3ad5c84a1b24519f5fcb1.png

--------------------------------------分割线 --------------------------------------

--------------------------------------分割线 --------------------------------------

OpenCV的详细介绍:请点这里

OpenCV的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值