NDK环境配置

Android Studio 配置

(不是SDK,麻烦各位看官看清楚)

  • 手动配置

    • 步骤一:下载sdk 下载方式有两种

      • 一官方下载(请***)

        • https://developer.android.com/ndk/index.html

        这里写图片描述

      • 二在studio中下载(如下载慢”拿梯子FQ”)
        这里写图片描述
        选择NDK和LLDB 2.2 (调试工具,不下载也可开发 只是很难受,连源码都关联不了)

    • 步骤二:设置NDK的环境变量
      假设你下载的NDK路径如下F:\android-ndk-r12b
      如下这里写图片描述
      那么我们

      • 如图
        这里写图片描述
      • 下一步
        这里写图片描述
      • 继续 选择环境变量
        这里写图片描述
      • 弹出的的菜单中
        这里写图片描述
    • 最后 粘贴路径(记得加冒号)确定后返回上一个界面继续点击确定应用即可

  • 步骤三:在工程目录src/main/jni新建c文件Android.mk 和 Application.mk

    • Android.mk:建立目标编译生成的类库名
    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE    := hello   # 生成的静态链接库或动态链接库的名字, linux 下生成 libhello.so
    LOCAL_SRC_FILES := hello-jni.c # 所有的源文件,空格隔开include $(BUILD_SHARED_LIBRARY) # 生成动态链接库
    • Application.mk
     APP_ABI := all   # 生成所有CPU架构下的库,如果没有 Application.mk 默认只会生成 arm 架构下的库
    • hello-jni.c (javah 命令获取头–要在某个类包文件根目录前打开命令控制输入ndk-build)
      我们先看看源码:
    package com.example.administrator.myapplication;import android.provider.Settings;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("hello");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public native int stringFromJNI();
    }
    
    • 如 某个类的包:com.example.administrator.myapplication
      那么我们要在com父目录下按下shift建 右键 在跳出选项窗口选择
      这里写图片描述

    • 在控制输入ndk-build包目录+类如com.example.administrator.myapplication.MainActivity
      这里写图片描述

    • 之后会在包根目录的上级目录生成 包二级包三级包_类名.h文件

    这里写图片描述

这里写图片描述

最后将得到头文件写入C文件的函数
#include <jni.h>jstring Java_com_example_lesliefang_myapplication_MainActivity_stringFromJNI(JNIEnv *env,jobject thiz) {return (*env)->NewStringUTF(env, "Hello from JNI !  ");}
目录结果图 

这里写图片描述

  • 步骤四:build.gradle 中添加如下配置
android {sourceSets{main{jni.srcDirs = [] // 阻止 gradle 自己生成 Android.mk 文件,因为我们自己写了jniLibs.srcDir 'src/main/libs' // 打包时从这里拿 .so 文件}}
}

这里写图片描述

  • 切换到 src/main/jni 目录下执行 ndk-build 就在 libs 下生成了各个平台的库文件
    这里写图片描述

最后运行即可 (注意自己生成的so库和手机处理器要对应 X86 x64 ,arm,mips)


  • 自动配置(让studio自己编译so类库)
    需要下载了studio 的LLDB上面下载的时候提过

    • 步骤一 在project Structure中配置SDK目录
      这里写图片描述
      这里写图片描述

    • 这跟直接在 local.properties 写是一样的

    ndk.dir=/Users/lesliefang/leslie/android/android-ndk-r10e
    sdk.dir=/Users/lesliefang/leslie/android/android-sdk-macosx
    • 步骤二:build.gradle 中添加一个配置
      这里写图片描述

现在目录结构是这样的, Android.mk 和 Application.mk 都不要了直接在jni写C代码(头名字获取上描述一致)
这里写图片描述

  • 不过这里可能运行时可能会出现错误
  • 如下

    这里写图片描述

    • 解决方法:
      gradle.properties文件末尾写上android.useDeprecatedNdk=true

    这里写图片描述


Elipse配置DNK

  • 手动配置

    • 跟Studio比较 少了一步骤四 步骤四:build.gradle 配置
  • 自动配置

    • 步骤一: 配置NDK路径 在Window的preference中Android-ndk
      这里写图片描述
    • 步骤二:在某个安卓项目右键Android Tools 在选择Add Android Native support 然后输入要生成的类库名

    这里写图片描述

这里写图片描述

完成后自动在创建jni文件夹并创建一个 类库名.cpp 和一个Android.mk
当然你想自己控制生成某个处理器C语言 那么再建立一个Application.mk 不写只生产arm (studio默认全部生成三种)
这里写图片描述

  • 步骤三 添加jni.h头文件
    这里写图片描述

在跳出的菜单中选择C/C++general选择path and Symbols 在右侧选择add 选择 SDK目录下的platforms/android-xx/arch-arm(你自己选择)/include

这里写图片描述

转载于:https://www.cnblogs.com/muyuge/p/6152228.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Class类的理解

package JavaReflcet;import org.junit.Test;public class ClassTest {/*获取Class的实例的方式*/Testpublic void test1() throws ClassNotFoundException { // 方式一&#xff1a;调用运行时类的属性: .classClass clazz person.class;System.out.println(clazz);// …

面向对象概述(课堂笔记)

例如&#xff1a; //创建一个Scanner(扫描器)类型的工具实例&#xff08;对象&#xff09;&#xff0c;用于获取用户从键盘输入的数据 Scanner scannew Scanner(System.in); //创建一个Random(随机)类型的工具实例&#xff08;对象&#xff09;&#xff0c;用来生成随机数 Rand…

关于__str__的介绍

在python语言里&#xff0c;__str__一般是格式是这样的。class A: def __str__(self): return "this is in str"事实上&#xff0c;__str__是被print函数调用的&#xff0c;一般都是return一个什么东西。这个东西应该是以字符串的形式表现的。如果不是要用…

BLOB数据类型、事务

Blob数据类型&#xff1a; 事务&#xff1a;

资源整理

资源整理 学习网站 学堂在线 链接&#xff1a;http://www.xuetangx.com/简介 学堂在线是免费公开的MOOC&#xff08;大规模开放在线课程&#xff09;平台&#xff0c;是国家教育部MOOC研究中心官方合作平台&#xff0c;致力于通过来自国内外一流名校开设的免费网络学习课程 EDX…

[工具] 知网(CNKI)文献下载工具

https://github.com/amyhaber/cnki-downloader 用于免费搜索&#xff0c;下载CNKI上的各类文献资料 转载于:https://www.cnblogs.com/Areas/p/5887671.html

Web中Servlet

一&#xff1a; web.xml中的代码如下 <web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>AddServlet</servlet-name><servlet-class>servlets.AddServlet</servlet-class>&l…

Thymeleaf视图模板的学习以及一些语法用法

流程&#xff1a;客户端向服务端的index组件发送请求&#xff0c;index组件会调用FruitDAO直至获取到数据库的数据&#xff1b;服务端获取到fruitList之后&#xff0c;存入到Session中&#xff0c;方便之后使用&#xff1b;之后调用ViewBaseServlet中的processTemplate方法&…

21 RadioGroup ListFragment

结构 MainActivity.java package com.qf.day21_radiogroupfragment_demo3;import java.util.ArrayList; import java.util.List;import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.…

XML与过滤器、事务管理

一 XML 二&#xff1a;过滤器&#xff08;Filter&#xff09; 功能&#xff1a; WebFilter("/demo01.do") public class Demo01Filter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doF…

Mybatis获取参数值的各种情况

public interface SelectMapper {//根据ID查询用户信息User getUserById(Param("id") Integer id);//查询所有用户信息List<User> getAllUser();//查询用户信息的总记录数Integer getCount();//查询用户信息使用mapMap<String, Object> getUserByIdToMap…

Mybatis中的配置文件xml

在配置的过程中&#xff1a;我们的mapper接口要与映射的XML文件处在同一位置下&#xff08;层级相同&#xff09; 比如&#xff1a;java.mybatis.mapper.ParameterMapper 对应: resoureces.mybatis.mapper.ParameterMapper 否则在进行测试的时候会出现无效的绑定 Invalid b…

Mybatis中处理多对一的映射关系

数据库中的结构&#xff1a; 实体类&#xff1a; 最终结果&#xff1a; 一&#xff1a;级联属性查询 自定义resultMap中可以这样设置&#xff1a; <resultMap id"empAndDeptResultMapOne" type"Emp"><id property"eid" column"ei…

Mybatis中处理一对多的映射关系

一对多与多对一的区别&#xff1a; 以部门表为单位&#xff0c;一个部门会有很多员工为一对多的关系 以员工表为单位&#xff0c;会有多个员工在一个部门中为多对一的关系 一&#xff1a;collection 由于一个部门中会有多个员工&#xff0c;即一对多的关系因此我们需要的实体…

Mybatis中缓存

1、一级缓存 SqlSession sqlSession SqlSessionUtils.getSqlSession();CacheMapper mapper sqlSession.getMapper(CacheMapper.class);Emp emp1 mapper.getEmpByEid(1);System.out.println(emp1);Emp emp2 mapper.getEmpByEid(1);System.out.println(emp2); 可以看到只访问…

HTML页面、CSS样式的以及js学习与介绍

html决定页面显示什么内容 css决定页面的美观程度html语言是解释型语言&#xff0c;解释不出来就不管了&#xff0c;不区分大小写 浏览器是容错的1&#xff09;html页面由一对标签组成:<html><html/>&#xff0c;分别成为开始标签和结束标签 2&#xff09;title:表…