Android下使用c++11的测试

有了新版本(4.8,r9)的交叉编译器(http://developer.android.com/tools/sdk/ndk/index.html),在Android下享受c++11带来的爽快体验变得很轻松。

本文在Linux环境下(Lubuntu 13.04)命令行创建一个NDK项目,简单测试了一些c++11的特性,包括:lambda表达式,智能指针,多线程和锁,用起来很稳定。

打算将项目用c++11特性重构的朋友可以放心使用,不必担心android端无法支持。


步骤如下:

1.直接拷贝NDK的例子,hello-jni

2.项目jni文件夹下,增加Application.mk文件,内容如下:

NDK_TOOLCHAIN_VERSION:=4.8
APP_STL:=gnustl_static

第一句使用最新版本的编译器,第二句使用stl。

3.改变Android.mk,如下:

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=hello-jni
LOCAL_SRC_FILES:=hello-jni.cpp
LOCAL_CPPFLAGS:=-std=c++11 -pthread
include $(BUILD_SHARED_LIBRARY)

倒数第二句,增加支持c++11和多线程。可以自行增加其他参数。

4.hello-jni.c文件改成cpp文件,注意一定要在首尾加上:

#ifdef __cplusplus
extern "C"{
#endif
....
#ifdef __cplusplus
}
#endif

5.相应的main函数改成cpp形式的,如下:

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject)
{
    multithread_calc();
    return env->NewStringUTF(ret.c_str());
}

6.这里面multithread_calc()是我自己写的,用来测试的,随便写的,可以看一下功能。完整代码如下:

#include <jni.h>
#include <vector>
#include <string>
#include <iostream>
#include <thread>
#include <memory>
#include <list>
#include <mutex>

using namespace std;

#ifdef __cplusplus
extern "C"{
#endif

class string_cl
{
public:
    string_cl(string * str)
    {
        string_p=shared_ptr<string>(str); // talent pointer
    }

    shared_ptr<string> string_p;
};

string ret;
int counter;
void multithread_calc()
{
    counter=0;
    mutex mu;//lock

    string_cl a(new string("Hello A"));
    string_cl b(new string("Hello B"));
    string_cl c(new string("Hello C"));

    list<shared_ptr<string>> str_p_list;
    str_p_list.push_back(a.string_p);
    str_p_list.push_back(b.string_p);
    str_p_list.push_back(c.string_p);

    function<int()> thread_func=[&]()//lambda
    {
        for(size_t i=0;i<1000000;++i)
        {
            mu.lock();
            counter++;
            mu.unlock();
        }
        return counter;
    };

    list<thread> thread_list;
    for(size_t i=0;i<4;++i)
    {
        thread_list.push_back(thread(thread_func));//thread
    }

    for(auto& t:thread_list)
    {
        t.join();
    }

    vector<shared_ptr<string>> str_p_vec;
    for(auto & sp:str_p_list)//foreach
    {
        str_p_vec.push_back(sp);
    }

    ret=*(str_p_vec[thread_func()%(str_p_vec.size())]);
}

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject)
{
    multithread_calc();
    return env->NewStringUTF(ret.c_str());
}

#ifdef __cplusplus
}
#endif
7.接下来,分别执行:

ndk-build

ant debug

adb install ...

测试结果不错。


  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

zhangchen_qinyinghua

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值