Android NDK 开发入门环境配置与小例子

Stella981
• 阅读 913

NDK:Native Development Kit原生开发工具

NDK能干什么:NDK使得在android中,java可以调用C函数库。

为什么要用NDK:我们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信大家都清楚C与java的优劣。顺带提一下:NDK并不能显著提升应用效率。why?我们都觉得C语言比起java来说效率要高出很多,一方面,随着jdk的不断更新,java的效率也随之提高;另一方面,即便使用C语言编码提高了应用效率,但是在java与C相互调用时平白又增大了开销。

对于这些问题,这里就不多说了,希望详细了解的,请各位自行搜索。

NDK开发,第一步,当然是搭建环境

首先,去http://developer.android.com/tools/sdk/ndk/index.html下载你对应平台的开发工具

以上内容来自

ndk有什么用想必要用的人都知道, 但是像其他工具一样。ndk的开发需要搭建环境,搭建环境这个东西,找不到路子就很麻烦,找到了路子就很容易。以前想学习android上opencv开发,但是当时一直找不到好路子搭建ndk,然后就不了了之了。

今天又来了兴趣搭建ndk,在历经的一段波折之后,终于如愿以偿了。

现在就和大家分享一下我的经历。

1.首先下载了NDK之后,直接解压到指定的目录就可一了,例如我的ndk主目录是 E:\android-ndk-r9d

本来老版本是需要安装cygwin的,但是新版本的可以不用装cygwin(我的是 ndk-r9d),直接用ndk的ndk-build.cmd(cygwin安装比较麻烦,等待时间也很久,有兴趣的同学可以自行百度,http://www.cygwin.com/)

2.然后就是将ndk的主目录添加到eclipse中,如下图

window->preferences->android->ndk

Android NDK 开发入门环境配置与小例子

至此,eclipse就可以使用ndk了,如果是想使用命令行模式下使用ndk,可以将ndk目录添加到环境变量中

例如我的是 NDK_HOME = E:\android-ndk-r9d  然后在Path最后面添加%NDK_HOME%(注意与前面的变量用分好隔开)

Android NDK 开发入门环境配置与小例子

打开cmd,输入ndk-build 出现下面字样说明成功

C:\Users\Tomorrow>ndk-build

Android NDK: Could not find application project directory !

Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.

E:\android-ndk-r9d\build/core/build-local.mk:148: *** Android NDK: Aborting Stop.

然后就是我们的小例子时间

创建android工程TestJni

一切默认,创建完成之后,右键工程,选中Andriod Tools -> Add Native Support..(最下面)

接下来会让你给你的本地库起一个名字 我的是 test-jni,点击确定,ok

Android NDK 开发入门环境配置与小例子

这个操作会自动地帮你的工程添加ndk所需的文件夹目录,并且生成对应的.mk .cpp文件(看以前的教程总是要手动添加,蛋疼不已。。)如下图,是不是很方便呢~~哈哈

Android NDK 开发入门环境配置与小例子

接下来就是我们的java代码了

package com.xmt.testjni;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TestJni extends Activity {
    static{
        System.loadLibrary("test-jni");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView t = new TextView(this);
        t.setText(stringFromJNI());
        setContentView(t);
    }
    public native String stringFromJNI();
}

代码很简单,主要就是这个

static{
    System.loadLibrary("test-jni");
}

public native String stringFromJNI();

链接库名字一定要对应,要不然找不到

ok,java这边写完了,再看 jni目录下的文件

首先是Android.mk,这个例子很简单,也没有这么文件直接默认

LOCAL_PATH := $(call my-dir)//当前路径

include $(CLEAR_VARS)

LOCAL_MODULE    := test-jni   //要生成的.so库名
LOCAL_SRC_FILES := test-jni.cpp  //你的.cpp文件名字

include $(BUILD_SHARED_LIBRARY)

接下来是cpp文件 (开始的时候只有#include<jni.h>)

#include <jni.h>
extern "C"
{
    jstring Java_com_xmt_testjni_TestJni_stringFromJNI(JNIEnv *env ,
        jobject thiz){
        return env->NewStringUTF("Hello from test-jni !");
    }
}

上面的代码就是返回一个字符串,但是有几点需要注意(我也是找了很久才知道。。。)

首先,一般会提示你找不带 jni.h (我的是警告),说明你的工程还没添加include目录,如果你看着不爽,想去掉他,就右键工程->属性->c/c++ Genenral->paths and symbols 选中里面的includes标签页,选择c/c++ 然后点击add

输入 ${NDK_HOME}:/platforms/android-14/arch-arm/usr/include(${NDK_HOME}是你的ndk主目录)

Android NDK 开发入门环境配置与小例子

  然后点击确定,之后在清理一下项目,然后构建一下项目,警告就没了~:)

第二点就是那个

extern "C"{//你的方法}

不能少(我看ndk samples下面那个hello-jni的cpp就没有,我模仿它写,就一直报

java.lang.UnsatisfiedLinkError:Native method not found:com.xmt.testjni.TestJni.stringFromJNI......错误,这个错误我找了好久才知道问题所在T^T)

第三就方法的名字

Java_com_xmt_testjni_TestJni_stringFromJNI//必须是 Java_packagename_classname_methodname格式

最后就是那个

env->NewStringUTF("Hello from test-jni !");
//ndk samples下面那个hello-jni里面是(*env),.c文件可以那样写,.cpp文件那样会报错

然后就大功告成~

运行你的项目,就会出现类似下面的画面

Android NDK 开发入门环境配置与小例子

ok,配置和例子都到这里(如有什么不对的地方请给我留言觉得好的话就点个赞吧还是第一次写呢)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
刘望舒 刘望舒
3年前
Android深入理解JNI(一)JNI原理与静态、动态注册
Android框架层Android深入理解JNIAndroid框架层本文首发于微信公众号「刘望舒」前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在JavaFramework层。这一个系列我们来一起深入学习JNI。<!more1.JNI概述Android系统按语言来划分的
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Android NDK 开发(五)AndroidStudio 2.2 NDK的开发环境搭建
前言之前一直在用Eclipse做开发,直到今年年初才将项目迁移到Google推荐的AndroidStudio上面,毕竟这是一个趋势,可谁知道事情根本没有我想的那么简单,这期间遇到了N多坑,我想这些坑可能大家也有可能遇到,不在这里详细叙述。最终一个个问题的去解决,走完了这些坑,觉得还挺好用的,Eclipse是一个吃内存的IDE,
Stella981 Stella981
3年前
NDK集成libjpeg和libpng
最近要在android上使用libjpeg和libpng库来做些图片的处理工作,下载了源码,在pc上使用configure&make&sudomakeinstall,然后参照example.c写了一些例子,都还不错。但是现在要移植到android里面,就需要使用NDK来进行编译了,试了一些交叉编译的方法,由于自己对这方面也不是很了解,所以效果
Wesley13 Wesley13
3年前
JNI实战全面解析
简介项目决定移植一款C开源项目到Android平台,开始对JNI深入研究。JNI是什么?JNI(JavaNativeInterface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。NDK是什么?AndroidNDK(NativeDe
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这