1. 程式人生 > >Android Studio NDK環境配置(opencv)以及使用

Android Studio NDK環境配置(opencv)以及使用

Android Studio NDK環境配置

window環境:

  • jdk1.7以上,配置好,Path路徑
  • Android studio 2.0版本(其他版本類同)
  • NDKR9以上,本文中使用的NDK11

1, 新建工程 (略)
右鍵工程檢視open moduleSetting確保Sdk nkd配置完成。

這裡寫圖片描述

2,設定ExternalTools:File>Setting>Tools>ExternalTools

這裡寫圖片描述

點選+進入編輯介面(分別設定如下命令,直接使用如下設定)
a,javah命令設定
name 隨意寫,便於記憶。
Program:輸入javah的路徑。
Parmeters:輸入需要的jar地址,注意“$Classpath” 兩邊的雙引號。
Working directory:為輸出的路徑。

這裡寫圖片描述
b,ndk-build設定(編譯ndk命令)
按照下圖設定。

這裡寫圖片描述

c,ndk-clean設定(清除so的命令)
按照下圖設定

這裡寫圖片描述

3,編寫ndk介面
右鍵點選工程>new>class 輸入類名建立新的類(NdkUtil.java)
輸入如下程式碼:

public native String getString(String a);
    static{
        System.loadLibrary("ndkutil");
}

4,編譯工程
Build>Make Project

這裡寫圖片描述

5,建立jni目錄
在java目錄點選右鍵,或者點選File>new >Folder>JNI Folder ,後選擇main
這裡寫圖片描述

6,生成標頭檔案
右鍵點選NdkUtil彈出選單選擇 ExternalTools >javah
如果出現
����: �Ҳ��� ‘com.top.ndkdemo.NdkUtil’ �����ļ���
Process finished with exit code 1
請檢查是否已經第四步操作或者javah命令寫錯了,再次提醒雙引號。
成功將在jni目錄下面出現.h標頭檔案

7,複製出.cpp檔案
編寫函式部分,extern “C” 一些保留,不要變動。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_top_ndknew_NdkUtils */ #ifndef _Included_com_top_ndknew_NdkUtils #define _Included_com_top_ndknew_NdkUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_top_ndknew_NdkUtils * Method: getString * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_top_ndknew_NdkUtils_getString (JNIEnv *env, jobject obj, jstring jstr){ return env->NewStringUTF("form jni"); } #ifdef __cplusplus } #endif #endif

8,編寫.mk檔案,直接到ndk資料夾或者opencvAndroid工程下面找個demo拷貝Applation.mk和Android.mk檔案到jni目錄然後修改裡面的引數。
LOCAL_MODULE :=ndkutil
LOCAL_SRC_FILES :=ndkutil.cpp
inclue <你自己硬碟中opencv的sdk路徑找到jni目錄>/OpenCV.mk
詳細程式碼如下:
a,Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include ../../sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := native_activity
LOCAL_SRC_FILES := native.cpp
LOCAL_LDLIBS    += -lm -llog -landroid
LOCAL_STATIC_LIBRARIES += android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

2,Application.mk

APP_ABI := armeabi-v7a
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_PLATFORM := android-19

9,右鍵點選jni ExternalTools >ndk-build
切換工程檢視方式(Project)會在libs下面發現編譯完成的so檔案,如cpp修改只需要重新編譯出新的so。

10,建立jniLibs目錄
右鍵main目錄 new>Directory 輸入jniLibs建立目錄,複製剛剛生成的armeabi-v7a目錄到該目錄下面。同時在gradle.properties檔案中加入一行android.useDeprecatedNdk=true
這樣就可以使用剛才的so檔案了。

可以在mainActivity中測試我們的jni庫是否可用。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,""+new NdkUtil().getString(),Toast.LENGTH_SHORT).show();
    }
}