欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-06 00:01:55
一、ndk与jni简介 ndk全称为native development kit本地语言(c&c++)开发包。而对应的是经常接触的android-sdk,(softwar...

一、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/index.html

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

本人使用的sdk和ndk为

Android 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的源文件。

Android 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 NDK开发的环境搭建与简单示例

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

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

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

三、相关问题

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环境搭建及示例代码,做的整理,后续继续补充相关资料谢谢大家对本站的支持!