- Create class NativeClass with function getStringFromNative:
public class NativeClass {
public native static String getStringFromNative();
}
-
Build project to generate classes
-
Open terminal. Change to app/src/main. Then run
javah -d jni -classpath ../../build/intermediates/classes/debug/ com.example.ndk_opencv_androidstudio.NativeClass
- Create "com_example_ndk_opencv_androidstudio_NativeClass.cpp" in c folder (jni folder).
#include
JNIEXPORT jstring JNICALL Java_com_example_ndk_1opencv_1androidstudio_NativeClass_getStringFromNative
(JNIEnv * env, jobject obj){
return env->NewStringUTF("Hello from JNI");
}
- Edit build.gradle. Add ndk moduleName in defaultConfig
defaultConfig {
applicationId "com.example.ndk_opencv_androidstudio"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "-0"
ndk {
moduleName "MyLib"
}
}
- Load MyLib in MainActivity
static {
System.loadLibrary("MyLib");
}
- Add id to TextView
android:id="@+id/testTextView"
- Use getStringFromNative() to change testTextView text
TextView tv = (TextView) findViewById(R.id.testTextView);
tv.setText(NativeClass.getStringFromNative());
- Open build.gradle. Add this before buildTypes
// begin
sourceSets.main {
jni.srcDirs = [] //disable automatic ndk-build call
}
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine "/home/robotbase/Android/NDK64/android-ndk-r10d/ndk-build",
'NDK_PROJECT_PATH=build/intermediates/ndk',
'NDK_LIBS_OUT=src/main/jniLibs',
'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
'NDK_APPLICATION_MK=src/main/jni/Application.mk'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
//end
- Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := com_example_ndk_opencv_androidstudio_NativeClass.cpp LOCAL_LDLIBS += -llog LOCAL_MODULE := MyLib include $(BUILD_SHARED_LIBRARY)
- Application.mk
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a APP_PLATFORM := android-16
-
Download OpenCV: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/
-
Edit Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= /home/robotbase/Android/OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_ndk_opencv_androidstudio_NativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := MyLib
include $(BUILD_SHARED_LIBRARY)
- Edit MainActivity.java
static {
System.loadLibrary("MyLib");
System.loadLibrary("opencv_java");
}
- Open Android Studio, choose import
- Select OpenCV-2.4.10-android-sdk/sdk/java/ -> choose new location ** opencv-java **
- Build > Rebuild Project
- Close Project
- Open NDK_OpenCV_AndroidStudio
- File > Import Module
- Select ** opencv-java **
- Edit build.gradle
dependencies {
...
compile project(':opencv-java')
}
- Import org.opencv.... and code OpenCv in Java