android的ndk学习(1)

  之前学了一段时间ndk,总认为要总结一下。ndk使得很方便地实现java和C与C++代码的相互沟通。合理地掌握使用ndk能够提高应用程序的运行效率。所以对于学习anndroid开发的人来说,ndk是必须掌握的工具。刚刚開始学习的时候是有点兴奋。有点害怕的,兴奋是由于之前学过C++语言。能将学过的东西结合在一起,感觉能够做出更好的东西,害怕的是之前听身边的大神说ndk在android开发中是很难的内容之中的一个。可是无论怎么说我还是找了本书,看了视频,找了一些电子资料,而且開始了学习ndk之路!

一,第一个程序Hello world

   相对来说,使用ndk实现大量的原生方法并让他们与Java类同步非常easy成为一个繁琐的任务。

首先须要新建一个android项目。然后在主函数那里声明一个native方法,代码例如以下

public class MainActivity extends  Activity {

	public static native String test();

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); }

然后使用命令行,開始-cmd,切换到项目的src文件夹下再运行命令例如以下:

javah -d ../jni 包名.MainActivity

这时候刷新项目就会发现多了一个jni目录,里面有个.h的文件,打开就是一个c头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_exercise_MainActivity */ #ifndef _Included_com_example_exercise_MainActivity
#define _Included_com_example_exercise_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_example_exercise_MainActivity_MODE_PRIVATE
#define com_example_exercise_MainActivity_MODE_PRIVATE 0L
#undef com_example_exercise_MainActivity_MODE_WORLD_READABLE
#define com_example_exercise_MainActivity_MODE_WORLD_READABLE 1L
#undef com_example_exercise_MainActivity_MODE_WORLD_WRITEABLE
#define com_example_exercise_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef com_example_exercise_MainActivity_MODE_APPEND
#define com_example_exercise_MainActivity_MODE_APPEND 32768L
#undef com_example_exercise_MainActivity_MODE_MULTI_PROCESS
#define com_example_exercise_MainActivity_MODE_MULTI_PROCESS 4L
#undef com_example_exercise_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define com_example_exercise_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef com_example_exercise_MainActivity_BIND_AUTO_CREATE
#define com_example_exercise_MainActivity_BIND_AUTO_CREATE 1L
#undef com_example_exercise_MainActivity_BIND_DEBUG_UNBIND
#define com_example_exercise_MainActivity_BIND_DEBUG_UNBIND 2L
#undef com_example_exercise_MainActivity_BIND_NOT_FOREGROUND
#define com_example_exercise_MainActivity_BIND_NOT_FOREGROUND 4L
#undef com_example_exercise_MainActivity_BIND_ABOVE_CLIENT
#define com_example_exercise_MainActivity_BIND_ABOVE_CLIENT 8L
#undef com_example_exercise_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
#define com_example_exercise_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef com_example_exercise_MainActivity_BIND_WAIVE_PRIORITY
#define com_example_exercise_MainActivity_BIND_WAIVE_PRIORITY 32L
#undef com_example_exercise_MainActivity_BIND_IMPORTANT
#define com_example_exercise_MainActivity_BIND_IMPORTANT 64L
#undef com_example_exercise_MainActivity_BIND_ADJUST_WITH_ACTIVITY
#define com_example_exercise_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef com_example_exercise_MainActivity_CONTEXT_INCLUDE_CODE
#define com_example_exercise_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_example_exercise_MainActivity_CONTEXT_IGNORE_SECURITY
#define com_example_exercise_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_example_exercise_MainActivity_CONTEXT_RESTRICTED
#define com_example_exercise_MainActivity_CONTEXT_RESTRICTED 4L
#undef com_example_exercise_MainActivity_RESULT_CANCELED
#define com_example_exercise_MainActivity_RESULT_CANCELED 0L
#undef com_example_exercise_MainActivity_RESULT_OK
#define com_example_exercise_MainActivity_RESULT_OK -1L
#undef com_example_exercise_MainActivity_RESULT_FIRST_USER
#define com_example_exercise_MainActivity_RESULT_FIRST_USER 1L
#undef com_example_exercise_MainActivity_DEFAULT_KEYS_DISABLE
#define com_example_exercise_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_example_exercise_MainActivity_DEFAULT_KEYS_DIALER
#define com_example_exercise_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef com_example_exercise_MainActivity_DEFAULT_KEYS_SHORTCUT
#define com_example_exercise_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_example_exercise_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_example_exercise_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_example_exercise_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_example_exercise_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
* Class: com_example_exercise_MainActivity
* Method: test
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_exercise_MainActivity_test
(JNIEnv *, jclass); /*
* Class: com_example_exercise_MainActivity
* Method: updateFile
* Signature: (Ljava/lang/String;)V
*/
<pre name="code" class="java">JNICALL Java_com_example_exercise_MainActivity_updateFile
(JNIEnv *, jclass, jstring)

#ifdef __cplusplus}#endif#endif


代码非常长。可是我们临时仅仅要看

JNICALL Java_com_example_exercise_MainActivity_updateFile
(JNIEnv *, jclass, jstring)

这就是依据我们一開始在mainactivity定义的那个native方法生成的一个方法。

有了头文件,我们就能够開始写.c文件了。即实现文件,新建一个文件main.c。然后输入代码例如以下

#include<stdio.h>
#include<stdlib.h>
JNIEXPORT jstring JNICALL Java_com_example_exercise_MainActivity_test
(JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env, "Hello world !");
}

返回一个字符串,这就是java与c交互的代码。

可是如今还不能直接执行,还要新建一个android.mk文件对项目进行配置,代码例如以下:
LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.c
include $(BUILD_SHARED_LIBRARY)

好了,然后就是在mainactivity中用法了。代码例如以下

public class MainActivity extends  Activity {

	public static native String test();

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView t = (TextView)findViewById(R.id.jnitextview);
t.setText(test()); }
static {
System.loadLibrary("main");
} }

导入库是使用的

  static {
System.loadLibrary("main");
}

main是我们在android.mk中配置的一个名字,如今万事俱备,仅仅差编译生成so文件了。我们打开cmd而且切换到项目的文件夹下,执行ndk-build。中间是减号,不是下划线,刷新项目就能够看到libs中多了个文件夹和里面的一个libmain.so文件,这时候就能够执行项目了!

假设没有意外就会出现helloworld在手机频幕上。

二。打印log

打印log是必须掌握的仅仅是。所以这里介绍一下怎么配置,首先是配置android.mk文件。加入一行代码

LOCAL_LDLIBS    += -llog
完整的android.mk代码例如以下
LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

然后在实现文件里加入头文件#include<android/log.h>

而且宏定义要打印log的类型
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))

#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
在代码中使用LOGI()或者LOGW。执行程序,然后就能够打印log了!更加具体的能够去看java api文档中的ndk篇。

三,总结

刚開始学jni,要配置这个要配置那个的很麻烦,可是写了一个helloworld以后感觉配置也就那样,万事开头难啊!相信后面的学习会越来越难。可是也会越来越有意思,希望继续加油!

android的ndk学习(1)的更多相关文章

  1. Android Studio NDK 学习之接受Java传入的字符串

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫Prompt,其 ...

  2. Android Studio NDK 学习之接受Java传入的Int数组

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫AndroidJ ...

  3. android的JNI 、 NDK 学习!

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  4. Android JNI和NDK学习(04)--NDK调试方法(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092812.html 本文主要介绍在ndk中添加log的方法.然后,我们就可 ...

  5. Android JNI和NDK学习(03)--动态方式实现JNI(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092491.html 前面总结了静态实现JNI的方法,本文介绍如何动态实现J ...

  6. Android JNI和NDK学习(01)--搭建NDK开发环境(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html 本文主要介绍“JNI”.“Android NDK”以及 ...

  7. Android之NDK开发(转)

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  8. ndk学习20: jni之OnLoad动态注册函数

    一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...

  9. NDK学习4: Eclipse HelloWorld

    NDK学习4: Eclipse HelloWorld 1.配置Eclipse NDK环境  Window->preferences->android->ndk   2.新建Andro ...

随机推荐

  1. 新手写的一个DBCP工具类

    package com.xx.questionnaire.util.dao; import java.io.IOException; import java.sql.Connection; impor ...

  2. 框架开发之Java注解的妙用

    注解的好处:1.能够读懂别人写的代码,特别是框架相关的代码.2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰.3.(重点 ...

  3. template or render function not defined.

    template or render function not defined. H_婷 关注 2018.08.16 17:22 字数 106 阅读 3859评论 0喜欢 2 下午写 Vue $par ...

  4. 10C++类和对象

    类和对象 8.1 面向对象程序设计方法概述 到目前为止,我们介绍的是C++在面向过程的程序设计中的应用.对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其 ...

  5. Delphi新注释

    标准请看帮助文件里的:XML Documentation Comments 个人常用 <summary></summary>:摘要 /// <summary> // ...

  6. ios打电话发短信接口

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [[UIApplication sharedApplicatio ...

  7. 在SpringBoot框架中使用拦截器

    1.继承WebMvcConfigureAdapter类,覆盖其addInterceptors接口,注册我们自定义的拦截器 package com.eth.wallet.config; import c ...

  8. 简谈Redis

    1.为什么使用redis 分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发.当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中 ...

  9. 看完这篇 你就能完全操作git 远程分支的增、删、改、查了

    最近项目中又用到了git所以在此总结一番,这篇主要针对的是怎么创建远程分支,如何删除远程分支. 首先,如何创建远程分支.将一系列前期准备工作准备完成后(创建\添加ssh): 在终端键入 git bra ...

  10. 对 Spring IoC 的理解

    理解 “ 控制反转(IoC)” 控制反转(IoC):用白话来讲,就是由 Spring 容器控制程序中类与类之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓 “控制反转” 的概念所在:控制权 ...