android 与C/C++混合编程小例子讲解o

1. 配置好android 开发环境:参考http://blog.csdn.net/hhao137/article/details/4314862

2.新建一个android 项目,本人项目命名为:CPP,并且生成的activity 命名为:AndroidCppActivty


3.生成本地的jni文件夹,操作如下:右击CPP项目,选择Android Tools,再选择Add Native Suport,然后在CPP项目中会生成jni文件夹


现对ANDROID调用C++与C分别进行说明:

1)调用本地C++代码:

1. 在jni 中的Android.mk 中输入如下命令:(注:本博客先对android 调用C++的进行说明,所以只放入了CPP后缀的文件)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := learningcpp
LOCAL_SRC_FILES := learningcpp.cpp

include $(BUILD_SHARED_LIBRARY)

2.在jni 中新建一个Application.mk文件,输入如下命令:

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

3.在jni 中新建learning.cpp文件,其中包括的代码如下(注意此处要加上extern "C"命令,这是与android 调用C不同的地方):

#include
#include
#include
using namespace std;
extern "C"{


jstring Java_com_example_cpp_AndroidCppActivity_getStringCpp( JNIEnv* env,jobject thiz )//注意这个方法的命名
{


return env->NewStringUTF("android with cpp!");
}
}

4. 在我们的activity类中的代码如下(主要是显示调用是否成功,所以很简单):

package com.example.cpp;


import android.os.Bundle;
import android.app.Activity;
import android.view.Gravity;
import android.view.Menu;
import android.widget.Toast;


public class AndroidCppActivity extends Activity {

public native String getStringCpp();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast t = Toast.makeText(getApplicationContext(),getStringCpp(), Toast.LENGTH_LONG); 
    t.setGravity(Gravity.CENTER, 0, 0); 
    t.show();
}

static{
System.loadLibrary("learningcpp");
}
}

5. 进行编译运行,结果如下:

android 与C/C++混合编程小例子讲解o_第1张图片


为了的android中使用opencv的C++代码,可对上述再进行如下配置:

下载一个OpenCV-2.4.7.1-android-sdk,解压到工作空间中,再导入到eclipse中,最后把它当作AndroidCppActivty一个库文件,如下:


2.为了使用C++中的opencv函数,修改Android.mk 的配置:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")  
#try to load OpenCV.mk from default install location  
include E:\android\OpenCV-2.4.7.1-android-sdk\sdk\native\jni\OpenCV.mk   //注意这个文件的路径
else  
include $(OPENCV_MK_PATH)  
endif 


LOCAL_MODULE    :=learningcpp
LOCAL_SRC_FILES := learningcpp.cpp


include $(BUILD_SHARED_LIBRARY)

这样我们就可以使用opencv的C++代码

2)调用本地C代码:

1. 在jni 中的Android.mk 中的现在命令后面输入如下命令:(注:本博客现对android 调用C的进行说明)

include $(CLEAR_VARS)

LOCAL_MODULE    := learningc
LOCAL_SRC_FILES := learningc.c

include $(BUILD_SHARED_LIBRARY)

3.在jni 中新建learning.c文件,其中包括的代码如下(注意此处可不加上extern "C"命令,这是与android 调用C++不同的地方):

#include
#include


jstring Java_com_example_cpp_AndroidCppActivity_getStringC( JNIEnv* env,jobject thiz )
{


     return (*env)->NewStringUTF(env,"android with c!");//与C++是不一样的


}


4. 在我们的activity类中的代码如下(主要是显示调用是否成功,所以很简单):

package com.example.cpp;


import android.os.Bundle;
import android.app.Activity;
import android.view.Gravity;
import android.view.Menu;
import android.widget.Toast;


public class AndroidCppActivity extends Activity {

public native String getStringCpp();
public native String getStringC();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast t = Toast.makeText(getApplicationContext(), getStringC(), Toast.LENGTH_LONG); 
    t.setGravity(Gravity.CENTER, 0, 0); 
    t.show();
}

static{
System.loadLibrary("learningcpp");
System.loadLibrary("learningc");
}

}


5. 进行编译运行,结果如下:


android 与C/C++混合编程小例子讲解o_第2张图片

你可能感兴趣的:(C++,opencv,android)