• 利用Android Studio编写 Android上的c与c++程序


    利用Android Studio编写 Android上的c与c++程序

      (2017-05-22 19:01:20)

    Android Studio 2.3.1

     FrankNote: Android 3.1.2

    1.       新建New Project:

    a)         利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序


    b)         利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序


    c)         利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序


    d)         利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序



    e)         利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序


    2.       自动打开新建的工程:

    a)         以project的方式显示工程:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    b)         Main目录下新建jni文件夹:

    FrankNote: 如果之前没有安装NDK, 自动下载NDK,  退出,重新打开Android Studio 就可以看到下图所示的项目

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    c)         jni文件夹下新建test_hello_world.cpp:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    d)         jni文件夹下新建Android.mk:

    FrankNote:  

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_CFLAGS += -pie -fPIE
    LOCAL_LDFLAGS += -pie -fPIE
    
    LOCAL_MODULE := test_hello_world
    LOCAL_SRC_FILES =: test_hello_world.cpp
    include $(BUILD_EXECUTABLE)
    LOCAL_CFLAGS += -pie -fPIE
    LOCAL_LDFLAGS += -pie -fPIE
    

     原因 PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的。因此不会报错。但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入如下flag就行。

    https://blog.csdn.net/hxdanya/article/details/39371759

    FrankNote End

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    e)         jni文件夹下新建Application.mk文件,作用在于支持c++共享库:

    FrankNote:

    APP_STL := gnustl_static
    原因:
    原方案使用的是共享库,这不一定都支持所有的机型,改用静态库gnustl_static  问题解决。
    https://blog.csdn.net/luozhuang/article/details/36418229

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    f)          注意观察project下的local.properties文件:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    g)         修改project下的gradle.properties文件,增加配置android.useDeprecatedNdk=true,其作用在于告诉系统使用ndk编译:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    h)         修改app目录下的build.gradle文件,增加配置:

                             i.              ndk的abiFilters配置作用在于限定生成的cpu/abi。

                           ii.              jni.srcDirs = [] 表示禁止as自动ndk编译,采用手动ndk-build。

                          iii.              jniLibs.srcDirs = [‘src/main/libs’]  表示经过ndk-build编译后的so路径。

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    i)           jni文件夹下新建Cmd script,make_x86.cmd,用于手动ndk-build:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    j)           右键点击make_x86.cmd文件选择Run cmd script:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    k)         获得目标程序文件test_hello_world:

    C:UsersjackiAppDataLocalAndroidSdk
    dk-bundle
    dk-build.cmd APP_ABI="x86"

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    3.       在Android虚拟机中执行程序:

    a)         开启x86 cpu/abi的虚拟机:

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    b)         使用adb命令把文件传到Android虚拟机中,并赋予可执行权限:

    静态库没有.so文件

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

    c)         添加当前路径为so库文件查找路径命令,防止elf文件运行阶段找不到so库的问题,LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp

    利用Android <wbr>Studio编写 <wbr>Android上的c与c++程序

  • 相关阅读:
    [文摘20090106]大量实战经验的真实网络创业经历分享(转)
    [转]MySQL 行号
    [转]C# Socket编程笔记
    [转]DirectShow:图片的抓取
    [书目20081213]抢在时间前面的7条捷径
    [文摘20090106]微软EPG老大让秘书发给大家的邮件
    [转]页面外仿 MSN 弹出提示信息的脚本改进版(仅能在IE下运行!)
    自此而后 加班 可以 不过 我只适度加班
    通过定时reload回发某页面请求 避免因用户一直不操作而引起的Session过期
    [转]ASP.NET2.0轻松搞定统计图表【月儿原创】
  • 原文地址:https://www.cnblogs.com/okgogo2000/p/9358249.html
Copyright © 2020-2023  润新知