`
abc20899
  • 浏览: 932651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android NDK 的学习之旅-----HelloWorld

 
阅读更多
1.在 ndk sample目录下创建 项目
android create project -n ndk001 -t 8 -p /Users/zhaoshun/android/android-ndk-r8/samples/ndk001 -a Test001 -k killqq.net.ndk

2.在项目的根目录下 创建jni目录
   jni目录中创建 c文件  与 android.mk文件

android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := \
HelloWorld.c
include $(BUILD_SHARED_LIBRARY)


一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。

a.
LOCAL_PATH := $(call my-dir)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

b.
include $( CLEAR_VARS)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

c.
LOCAL_MODULE :=  hello
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包 含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'HcSyncml'的共享库模块,将会生成'libhello.so'文件。

d.
LOCAL_C_INCLUDES := $(LOCAL_PATH)/extra_inc$(LOCAL_PATH)/main_inc
LOCAL_C_INCLUDES 中加入所需要包含的头文件路径

e.
LOCAL_SRC_FILES
LOCAL_SRC_FILES中加入源文件路径(需要编译的文件),多个文件用 ‘\’ 隔开

f.
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib –llog
表示允许打印Log

g.
include $(BUILD_SHARED_LIBRARY)  编译共享库

HelloWorld.c文件:
#include <string.h>
#include <jni.h>
jstring Java_killqq_net_ndk_Test001_getStringFromJNI( JNIEnv* env,jobject thiz )
{
       //返回一个字符串给Java层
    return (*env)->NewStringUTF(env, "HelloWorld from JNI !");
}


C文件中本地方法名的命名规则
如:Java_killqq_net_ndk_Test001_getStringFromJNI( JNIEnv* env,jobject thiz )
Jstring 为 返回值 ,也可以为 void , jint 等等 类型
Java_killqq_net_ndk_Test001_getStringFromJNI 为方法名,其中以下划线(_)隔开,
初始Java 为默认写法, killqq_net_ndk为包名, Test001为类名, getStringFromJNI为声明本地方法的方法名字

4.编写项目中的java文件
Android 应用层 MainActivity.java代码:

public class Test001 extends Activity {
    //也就是你mk配置文件中的  LOCAL_MODULE    := hello

    private static final String libSoName = "hello";
    private Context mContext = null;
    private Button btnClick = null;
    private String mStrMSG = null;

 @Override

 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     
     setContentView(R.layout.main);
     mContext = this;
     btnClick = (Button) findViewById(R.id.btn_click);
     btnClick.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                         //调用 JNI 层实现的方法
                         mStrMSG = getStringFromJNI();
                         if(mStrMSG == null) {
                                mStrMSG = "调用JNI失败";
                         }else {
							Toast.makeText(mContext, mStrMSG, 3).show();
						}
                  }
           });
 }

 /**
  * 声明本地方法
  * 该方法为native方法.由C实现
  * @return     JNI 给出的信息
  */
 public native String getStringFromJNI();

 /**
  * 载入JNI生成的so库文件
  */
 static {
     System.loadLibrary(libSoName);
 }
}
 


主要功能:
a)         静态载入 So 库
static {
               System.loadLibrary(libSoName);
}

b)        声明本地方法
public native String  getStringFromJNI();

c)         调用本地方法
String mStrMSG = getStringFromJNI();

5.开始编译
进入到项目的根目录下
执行 ndk-build命令
zhaodeiMac:ndk001 zhaoshun$ ndk-build
Compile thumb  : hello <= HelloWorld.c
SharedLibrary  : libhello.so
Install        : libhello.so => libs/armeabi/libhello.so
编译成功

6运行效果如下图所示:


  • 大小: 31.6 KB
分享到:
评论

相关推荐

    android-ndk(android-ndk-r26b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++开发工具集。...通过“android-ndk-r26b-windows.zip”,Windows用户可以方便地获取并开始他们的原生代码开发之旅。

    android-ndk(android-ndk-r25b-linux.zip)

    这个“android-ndk-r25b-linux.zip”文件是NDK的一个特定版本,即r25b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、...

    android-ndk(android-ndk-r25b-windows.zip)

    这个压缩包“android-ndk-r25b-windows.zip”包含了NDK的第25个版本,专为Windows操作系统设计。NDK的主要功能是让开发者能够在Android应用中使用原生代码,例如C、C++,以实现高性能计算或利用硬件加速等功能。 **...

    android-ndk(android-ndk-r23b-windows.zip)

    这个"android-ndk-r23b-windows.zip"压缩包包含了NDK的第23个版本,专为Windows操作系统设计。NDK是Android应用开发中的一个重要组成部分,它允许开发者使用原生代码(如C、C++)来编写部分应用程序,从而利用底层的...

    android-ndk-r19c-linux-x86_64.zip

    echo 'export PATH=$PATH:/opt/android/ndk/android-ndk-r19c' | sudo tee -a ~/.bashrc source ~/.bashrc ``` 现在,NDK已准备就绪。接下来,我们需要安装QT 5.13。访问QT官方网站(https://www.qt.io/download)...

    安卓NDK android-ndk-r12b-windows-x86_64

    可用于安卓 qt开发 安卓NDK android-ndk-r12b-windows-x86_64

    android-ndk(android-ndk-r26b-darwin.zip)

    在本案例中,我们关注的是"android-ndk-r26b-darwin.zip",这是一个专为macOS系统设计的NDK版本。 **Android NDK的主要功能和用途** 1. **性能优化**:对于计算密集型或图形密集型的应用,如游戏和复杂的科学计算...

    android-ndk(android-ndk-r23b-linux.zip)

    这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或...

    android-ndk-r17c-windows-x86_64.zip

    4. **工具链**:NDK包含了一系列编译、链接和其他工具,如arm-linux-androideabi-gcc(此版本的GCC)和clang,用于构建和优化针对不同Android架构的本地代码。 5. **预编译库**:NDK附带了一些预编译的库,如...

    android-ndk-r20b-windows-x86_64.zip

    对于64位Windows用户来说,"android-ndk-r20b-windows-x86_64.zip"是一个关键资源,它意味着可以直接在Windows环境中搭建本地开发环境,无需担心系统架构问题。解压后的文件包括了所有必要的工具和库,如编译器、...

    android-ndk-r18b-windows-x86_64.zip

    标题中的“android-ndk-r18b-windows-x86_64.zip”表明这是一个适用于Windows 64位系统的Android NDK版本,具体为R18B更新。 在Android应用开发中,NDK的主要用途包括: 1. **性能优化**:对于计算密集型或图形...

    android-ndk-r18b-linux-x86_64.zip

    android-ndk-r18b-linux-x86_64.zip https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip

    android-ndk-r9-windows-x86_64.zip

    《Android NDK R9:深入理解与应用》 Android NDK(Native Development Kit)是Google为Android平台提供的一套工具,允许开发者使用C/C++语言编写应用程序,从而利用原生代码的高性能。本文将深入探讨Android NDK ...

    android-ndk-r20-linux-x86_64.zip

    《深入理解Android NDK:基于android-ndk-r20-linux-x86_64.zip的探讨》 Android NDK,全称为Native Development Kit,是Google为开发者提供的一套工具集合,它允许开发者使用C和C++语言进行Android应用程序的开发...

    android-ndk-r10e-windows-x86_64.exe

    android-ndk-r10e-windows-x86_64.exe

    android-ndk-r16b-windows-x86_64.zip

    "android-ndk-r16b-windows-x86_64.zip" 是NDK的第16个版本,特别为Windows 64位操作系统设计。 在Android应用开发中,通常我们使用Java或Kotlin编写大部分代码,但由于这些语言运行在Dalvik或ART虚拟机上,它们的...

    NDK工具android-ndk-r10e-linux-x86_64

    标题中的"android-ndk-r10e-linux-x86_64"表明这是一个特定版本的NDK,即版本号为R10e,针对Linux 64位系统的版本。 **NDK的基本概念与功能:** 1. **本地库开发:**NDK允许开发者使用C/C++编写部分或全部应用代码...

    android-ndk-r23b-linux.zip

    NDK包含多个版本,如本例中的"android-ndk-r23b",代表着第23版的NDK,适用于Linux操作系统。 NDK的使用场景主要包括以下几点: 1. **性能优化**:对于CPU密集型任务,如图形渲染、物理模拟或者加密算法,使用C++...

    android-ndk-r16-windows-x86_64.zip

    android-ndk-r16-windows-x86_64.zip

    android-ndk(android-ndk-r25b-darwin.zip)

    `android-ndk-r25b-darwin.zip` 是针对macOS系统的NDK版本,版本号为r25b,包含了一系列用于构建、编译和调试原生代码的工具。 在Android应用开发中,NDK的主要作用和知识点包括: 1. **JNI (Java Native ...

Global site tag (gtag.js) - Google Analytics