01 android ndk入门实例之android.mk编译
前言
1 环境 android studio2.3 , window系统
2 ndk https://dl.google.com/android/repository/android-ndk-r16-windows-x86_64.zip
3 采用android.mk编译方式
正文
1 正常新建一个android项目
2 右键项目选择Open Moduls Settings
1)设定好ndk的路径

2)指定开启ndk

3 android新加如下文件

具体代码如下
NdkJniUtils.java
package com.jni.utils; /**
* Created by user on 2017/11/22.
*/
public class NdkJniUtils { static{
System.loadLibrary("hello-jni");
} public static native String stringFromJni();
}
hello-jni.c
#include <string.h>
#include <jni.h> jstring
Java_com_jni_utils_NdkJniUtils_stringFromJni( JNIEnv* env,jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Android.mk 配置如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk 配置如下
APP_ABI := armeabi armeabi-v7a x86 mips
注意:其中如果想生成所有平台的so,可以写成
APP_ABI := all
4 配置好build.gradle文件,在Android配置中添加如下配置
sourceSets{
main{
jniLibs.srcDirs "src/main/libs" // 指定so的路径
jni.srcDirs = [] // 禁止gradle自己去自动编译ndk,我们使用的方式是cmd中ndk-build方式
}
}
5 写完这些代码后,进入cmd,目录进入到我们的src/main/jni中,执行mk编译
>>ndk-build

编译完后,在src/main/libs目录中会看到我们生成的so文件

6 编写java层代码
activity_main.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"> <TextView
android:id="@+id/edv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" /> <Button
android:id="@+id/clickId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="clickBtn"/>
</LinearLayout>
MainActivity 类编写代码
package com.koo.ndkdemo; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import com.jni.utils.NdkJniUtils; public class MainActivity extends AppCompatActivity { TextView ev1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ev1 = (TextView)findViewById(R.id.edv);
Button btn=(Button)findViewById(R.id.clickId);
btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
String res= NdkJniUtils.stringFromJni();
ev1.setText(res);
}
});
}
}
完成后编译运行项目即可
01 android ndk入门实例之android.mk编译的更多相关文章
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- Android NDK入门实例 计算斐波那契数列二生成.so库文件
上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...
- android NDK入门 windows下安装cygwin
一.Android NDK环境简介 Android NDK 是运行于Android 平台上的Native Development Kit 的缩写. Android 应用开发者可以通过NDK 调用C 或 ...
- Android NDK 入门与实践
NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具. NDK 好处 1.NDK 可以生成 .so 文件, 方 ...
- Xamarin android SwipeRefreshLayout入门实例
android SwipeRefreshLayout 是实现的效果就是上滑下拉刷新ListView 获取其他控件数据.基本上每个App都有这种效果.Google提供了一个官方的刷新控件SwipeRef ...
- android -------- NDK 入门指南
NDK介绍 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具. 可用以从您自己的源代码构建,或者利用现有的预构建库. NDK 不适用于大多数初学的 A ...
- Windows下搭建Android NDK开发环境及命令行编译
首先说明本文内的相关安装操作参考<Pro Android C++ with the NDK>一书. 安装 Windows搭建Android NDK开发环境需要安装如下部分(同时需要配置对应 ...
- Android NDK学习(二):编译脚本语法Android.mk和Application.mk
一.Android.mk Android.mk分为一下几部分: LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量. i ...
- Android NDK开发实例教程
WINDOWS系统+ Eclipse + NDK+Android 最近开始学习Android平台开发,Android还没有玩转,Java也是刚入门,这又要开始在Android中调用C语言,需要利用ND ...
随机推荐
- Apache Cassandra 4.0新特性介绍
引言 大家好,我是蔡一凡,是Cassandra的贡献者之一.(虽然我不便透露我的公司名称),但目前我们公司Cassandra的部署是全世界最大的之一,Cassandra在我们公司也有很多的应用. Ca ...
- redis 过期策略你知道多少,看完文章你会不自觉说喔哦
Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除.你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割. 你还可以进一步站在死神的角度 ...
- C++数的表示
二进制B 八进制O 十进制D 十六进制H / 0x十六进制 十进制数转换成R进制数:整数部分除基取余,上右下左:小数部分乘基取整,上左下右. 浮点数的阶用一种称为移码的编码表示方法,方便对阶.阶的 ...
- WordCount (Python)
Github项目地址:https://github.com/w1036933220/WordCount 一.解题思路 把项目需求理清楚,画一个思维导图 考虑各部分功能所需要的大概实现思路 然后完成了计 ...
- asyncio系列之Lock实现
import types import select import time import socket import functools import collections class Futur ...
- JavaScript中pipe实战
JavaScript中pipe原理 代码示例 const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x); 原理 一行代码 ...
- vue实现pdf文件的在线预览
我是通过 <iframe> 标签就可以满足我工作的 pdf预览需求 如果<iframe> 无法满足需求 , 可以使用pdf.js这个插件,功能强大. <iframe :s ...
- Linux+Jenkins自动构建服务器包
何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...
- python3笔记-列表
列表去重的两种方式: # 创建列表放数据 a =[1,2,1,4,2] b=[1,3,4,3,1,3] d=[] for i in a: if i not in d: d.append(i) prin ...
- Codeforces1409 题解(A-F)
A. Yet Another Two Integers Problem 最优的操作中,\(k = \min(10, abs(a - b))\),记\(d=abs(a-b)\),最终的答案为\(ans ...