Android NDK学习记录(一)

一、NDK环境在Mac中部署

1.准备eclipse,android sdk安装包,android ndk安装包(http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2

2.部署android开发环境

3.部署NDK开发环境(配置环境变量)

二、编写基于NDK的HelloWorld

1.它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接库。

1 static {
2         System.loadLibrary("MFirstNDK");
3     }

2.native关键标识的方法,不需要方法体的抽象方法,是由C/C++来实现的

1 public static native String getStr();

3.MFirstNDK.cpp 文件  用于返回java 本地方法getStr返回的操作实现

 1 #include "jni.h"
 2 #include "com_threew_ndk_NDKPlus.h"
 3 /*
 4  * Class:     com_threew_ndk_NDKPlus
 5  * Method:    getStr
 6  * Signature: ()Ljava/lang/String;
 7  */
 8 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getStr
 9   (JNIEnv *env, jclass thiz) {
10     return env->NewStringUTF("hello world JNI");
11 }

4.编写好以上文件代码,就可以在Android Activity里面调用本地方法getStr(),并获取"hello world JNI"

三、利用Ant工具快速生成java本地方法的.h的头文件

eclipse中带有ant插件,可以见在项目下编写ant xml文件,并添加入ant工作目录中,双击或run as 就可以直接在jni文件夹下生成想要的头文件。xml内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- ======================================================================
 3      2014-9-20 上午11:27:05
 4
 5      MFirstNDK
 6      description
 7
 8      Rubert
 9      ====================================================================== -->
10 <project name="MFirstNDK" default="BuildAllHeaders">
11     <description>
12             description
13     </description>
14
15     <!-- =================================
16           target: default
17          ================================= -->
18     <target name="BuildAllHeaders">
19         <antcall target="BuildGetStringHeader"></antcall>
20         <antcall target="BuildGetIntHeader"></antcall>
21     </target>
22
23     <!-- - - - - - - - - - - - - - - - - -
24           target: depends
25          - - - - - - - - - - - - - - - - - -->
26     <target name="BuildGetStringHeader">
27         <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKInt"></javah>
28     </target>
29
30     <!-- =================================
31           target: name
32          ================================= -->
33     <target name="BuildGetIntHeader" >
34         <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKPlus"></javah>
35     </target>
36
37 </project>

四.新建c++ class 文件,并用java本地文件调用

1.在jni文件夹下创建Hello的c++文件,会生成Hello.h 和 Hello.cpp文件

2.在Hello.h文件内添加一个方法,内容如下:

 1 /*
 2  * Hello.h
 3  *
 4  *  Created on: 2014-9-20
 5  *      Author: Rubert
 6  */
 7
 8 #ifndef HELLO_H_
 9 #define HELLO_H_
10
11 class Hello {
12 public:
13     Hello();
14     char * getWords();
15     virtual ~Hello();
16 };
17
18 #endif /* HELLO_H_ */

3.在Hello.cpp文件的实现方法如下:

 1 /*
 2  * Hello.cpp
 3  * Created on: 2014-9-20
 4  * Author: Rubert
 5  */
 6 #include "Hello.h"
 7 Hello::Hello(){
 8     // TODO Auto-generated constructor
 9 }
10 char* Hello::getWords(){
11     return "hello";
12 }
13 Hello::~Hello(){
14     // TODO Auto-generated constructor

4.在MFirstNDK.cpp中的实现如下:

1 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getWords(JNIEnv *env, jclass){
2     Hello h;
3     return env->NewStringUTF((const char*)h.getWords());
4 }

5.遇到的问题

在编译工程中出现,4中得Hello 文件无法找到,前提是我头文件导入了,但是还是无法通过运行。最后发现是Eclipse错误提示的原因:最后是把一些提示都取消掉了

http://www.oschina.net/question/1987532_162259?sort=time

中间发现可能是这个问题,但是导入后依旧如此

http://blog.csdn.net/meegomeego/article/details/8109604

五、基于X86模拟器和Arm模拟

genymotion模拟器   基于X86架构

Android自带模拟器   基于Arm架构

一般情况下,NDK是生成Arm的so文件,如果想改成X86的so文件。那么就得在工程目录下,新建一个Application.mk文件,内容如下:

APP_ABI := x86 

如果两者都可以生成,则这么些

APP_ABI := x86 armeabi

六、附

Terminal相关记录,mac下得终端命令

1.乱码问题,打开终端,偏好-设置-高级-中文

2.通过cd命令进入文件夹,用open ./ 来打开当前文件夹

3.javah -jni com.xx.xx.xx.Xxx 生成头文件

  

时间: 2024-10-09 21:36:07

Android NDK学习记录(一)的相关文章

Android NDK学习笔记(一) 为什么要用NDK?

NDK是什么 NDK是Native Development Kit的简称,即本地开发工具包.通过NDK,Android允许开发人员使用本地代码语言(例如C/C++)来完成应用的部分(甚至全部)功能.注意:由于翻译原因,有些地方也把Native翻译为"原生". NDK是SDK的一个补充,可以帮助你做这些事情: 生成可以在ARM CPU,Android 1.5(及以上)平台运行的JNI兼容的共享库. 将生成的共享库放置在应用程序项目路径的合适位置,使其能自动地添加进你最终的(和经过签名的)

【转】Android NDK学习(2)Windows下NDK开发环境配置

一.配置好Android开发环境 现在android SDK的版本已经到了4.4了,几乎不用配置,下载下来解压,SDK跟Android开发专用Eclipse都有了.喜欢. 二.下载安装安卓NDK 下载最新版,解压即可. 2013年6月7日: 目前版本已经到了r8e. 三.下载安装cygwin   由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从uni

【Android】学习记录&lt;1&gt; -- 初识ffmpeg

工作需要用到ffmpeg来进行Android的软编码,对这玩意儿一点都不了解,做个学习记录先. FFmpeg:http://www.ffmpeg.org Fmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.

Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少东西,今天把Android的socket学习记录一下,以防止以后会出现这样的低级错误. 我这里是在极客学院的源码基础上做的自己的一些添加和修改,学习开始不就是先会修改么,举一反三,自然就很快学会了.由于看过视频和资料后就迫不及待的按照自己的想法想做一个功能,但是遇到麻烦了,就是执行new socke

Android NDK 学习之传递类对象

本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse->Window->Preferences->Android->NDK ,选择NDK的路径,然后Apply即可. 新建一个名为AndroidJNI_Object的Android工程,新建一个jni的文件夹,其目录下文件树列表如下: ├── jni│   ├── Android.mk│   ├─

Android NDK学习之第一个实例---端口扫描

为什么要写一个端口扫描的程序,Java来写不是很方便吗?因为我也没有想到什么例子能够方便的来练习.于是想到以前找到的端口扫描的C代码,于是想用他们来练习.扫描服务端端口的方式有许多种,最简单的就是直接去连接该端口,复杂一些的就是看SYN的应答.其他方式就不说了.下面的portScan.c位于jni目录下:(原本可在linux下运行,修改部分代码,使之能够返回结果给Java层的调用.)#include<stdio.h> #include<stdlib.h> #include<j

【转】Android NDK学习(3)使用Javah命令生成JNI头文件 .

第一步: 在Eclipse中创建android项目,并声明Native接口: public native int add (int a, int b);public native int sub (int a, int b); 编译.运行: 这样在bin目录下就会生成类文件: 第二步: 打开命令行cmd,到达bin目录: F:\fww\workspace\TestJNI\bin> 输入如下命令: F:\fww\workspace\TestJNI\bin>javah -d header -cla

android NDK 学习笔记(4)---eclipse 添加代码提示功能

1.选择项目右键Android Tools-->Add native support,然后再右键property. 随便选一个android的文件夹下面的include导入点击确定. 导入后会自动生成下面的文件,不用我们自己新建.c文件.系统会自动生成一个.c++的文件 编辑.cpp的文件

android零碎学习记录之 TextSwithcer

TextSwitcher 翻译"文本转换开关",顾名思义:该转换开关是转换TextView的.开关,意思很明确,必定只有2个文本,一个展示(即"开"),一个隐藏(即"关"). 2. 简单示例: java代码: View rootView = inflater.inflate(R.layout.fragment_main, container, false); final TextSwitcher switcher = (TextSwitcher)