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();
}
}