当前位置: 移动技术网 > IT编程>移动开发>Android > Android NDK开发的环境搭建与简单示例

Android NDK开发的环境搭建与简单示例

2019年07月24日  | 移动技术网IT编程  | 我要评论

西山会53人名单张昆生,传世群英传sf,魔怀

一、ndk与jni简介

ndk全称为native development kit本地语言(c&c++)开发包。而对应的是经常接触的android-sdk,(software development kit)软件开发包(只支持java语言开发)。

简单来说利用ndk,可以开发纯c&c++的代码,然后编译成库,让利用android-sdk开发的java程序调用。ndk开发的可以称之为底层开发或者jni(java native interface)层开发,sdk开发可以称为上层开发。

android开发中使用ndk的原因:

1、众所周知,利用sdk编写的代码,生成的apk,很容易就可以反编译了,安全性极为不高,而利用ndk开发的库,不容易被反编译,保密性,安全性都提高了。

2、很多开源工程和大型工程都是c&c++代码,把它们转换为纯java语言显然是不可能的。

3、c&c++的代码运行速度和效率都比java快很多。

jni全称为java native interface(java本地调用)。从java1.1开始,jni成为java平台的一部分,它允许java代码和其他语言写的代码(如c&c++)进行交互。并非从android发布才引入jni的概念的。

简单来说,android的ndk提供了一些交叉编译工具链和android自带的库,这些android的库可以让开发者在编写本地语言的程序时调用。而ndk提供的交叉编译工具链就对已经编写好的c&c++代码进行编译,生成库。当然了,你也可以自己搭建交叉编译环境,而不用ndk的工具和库。然后生成库,只要规范操作,一样可以生成能让java层成功调用的库文件的。

二、ndk环境搭建

使用最新ndk,直接抛弃cygwin,以前做android的项目要用到ndk就必须要下载ndk,下载安装cygwin(模拟linux环境用的),下载cdt(eclipse c/c++开发插件),还要配置编译器,环境变量,特别麻烦,新版就不需要了。

下载android sdk http://developer.android.com/sdk/

下载android ndk http://developer.android.com/tools/sdk/ndk/ (注:ndk版本在r7以上之后就集成了cygwin,而且还是十分精简版。)

本人使用的sdk和ndk为

eclipse配置

打开eclipse,点window->preferences->android->ndk,设置ndk路径,例如我的是f:android-ndk-r10e。新建一个android工程ndktest,在工程上右键点击android tools->add native support...,然后给我们的.so文件取个名字(默认已经起好了,就是包名ndktest)。这时候工程就会多一个jni的文件夹,jni下有android.mk和ndktest.cpp文件。android.mk是ndk工程的makefile,ndktest.cpp就是ndk的源文件。

接下来编写ndktest.cpp文件

<span style="font-size:14px;">#include <jni.h>
#include <string.h>
extern c
 
jstring java_com_example_ndktest_mainactivity_ndktestfromjni(jnienv* env,
    jobject thiz) {
  return env->newstringutf(hello from jni !);
}
</string.h></jni.h></span>

继续编写mainactivity.java文件

<span style="font-size:14px;">package com.example.ndktest;
 
import android.app.activity;
import android.os.bundle;
import android.widget.textview;
 
public class mainactivity extends activity {
 
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
 
    textview tv = new textview(this);
    tv.settext(ndktestfromjni());
    setcontentview(tv);
  }
 
  public native string ndktestfromjni();// native声明,表示这个方法来自native层。实现过程已经在native层实现了
 
  static {
    system.loadlibrary(ndktest);// 加载库,前面的lib和后缀名不用写
  }
}
</span>

编译运行,先编译cpp文件,右击工程项目ndktest,build project,成功结果在libs目录下生成了.so文件

然后编译android java工程,右击工程项目run application,部署到真机上的结果

三、相关问题

ndk搭建与实例过程中,遇到的一些问题如下:

eclipse报错“unresolved inclusion jni.h”

在做ndk开发过程中有时候在eclipse里会遇到其无法处理inclusion导致symbol显示错误,网上有许多方法可以解决类似“unresolved inclusion jni.h” 错误的方法,包括includepath等方法,不过对我都不管用。

最终的解决办法就是初始化eclipse对该project的nativesupport:

1. 在eclipse中关闭指定project

2. 用其他编辑工具打开该project的.project文件,删除以下内容:

......

org.eclipse.cdt.managedbuilder.core.genmakebuilder
clean,full,incremental,

......

org.eclipse.cdt.managedbuilder.core.scannerconfigbuilder
full,incremental,

......

org.eclipse.cdt.core.cnature
org.eclipse.cdt.core.ccnature
org.eclipse.cdt.managedbuilder.core.managedbuildnature
org.eclipse.cdt.managedbuilder.core.scannerconfignature

3. 删除.cproject文件

4. 在eclipse里打开原来的project, refresh,然后右键->properties->android tools -> add native support

5. 搞定

window平台下 eclipse ndk开发中的method 'newstringutf' could not be resolved问题

项目右键->属性->c/c++常规->code analysis,选择use project settings 中的方法无法被解析(method cannot be resolved)取消选择,应用->确定,然后刷新、清理、刷新、build项目。

jni/hellocpp/main.cpp:16:18:error: base operand of '->' has non-pointer type 'jnienv {aka _jnienv}'

错误在于:

(*env)->newstringutf(env, hello from jni !);

这一行,这是c的写法,而我的是cpp程序,需要改写成:

env->newstringutf( hello from jni !);

java.lang.unsatisfiedlinkerror:native method not found问题

1、c++中的方法java_xxx_xxx中的java 首字母一定要大写

2、如果是 .cpp 文件则用 extern c {您的方法在这里},大括号里是您的本地方法。

 以上就是对android  ndk环境搭建及示例代码,做的整理,后续继续补充相关资料谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网