android的ndk学习(1)
android的ndk学习(1)
一,第一个程序Hello world
首先须要新建一个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交互的代码。
- 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_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>
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
三,总结
android的ndk学习(1)的更多相关文章
- Android Studio NDK 学习之接受Java传入的字符串
本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫Prompt,其 ...
- Android Studio NDK 学习之接受Java传入的Int数组
本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫AndroidJ ...
- android的JNI 、 NDK 学习!
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
- Android JNI和NDK学习(04)--NDK调试方法(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092812.html 本文主要介绍在ndk中添加log的方法.然后,我们就可 ...
- Android JNI和NDK学习(03)--动态方式实现JNI(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092491.html 前面总结了静态实现JNI的方法,本文介绍如何动态实现J ...
- Android JNI和NDK学习(01)--搭建NDK开发环境(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html 本文主要介绍“JNI”.“Android NDK”以及 ...
- Android之NDK开发(转)
Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- ndk学习20: jni之OnLoad动态注册函数
一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...
- NDK学习4: Eclipse HelloWorld
NDK学习4: Eclipse HelloWorld 1.配置Eclipse NDK环境 Window->preferences->android->ndk 2.新建Andro ...
随机推荐
- eclipse自动为变量生成Get/Set函数
启动Eclipse,打开demo工程.如图: 假定为成员变量test生成Get/Set函数. 光标定位到该成员变量,如图: 右键选择“source”-“Generate Getters and ...
- 边框带阴影 box-shadow
.chosen-container-active .chosen-single { border: 1px solid #5897fb; -webkit-box-shadow: 0 0 5px rgb ...
- CAD绘制固定圆形标注(网页版)
js中实现代码说明: function DoFixCircleComment() { var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity ...
- java_线程的通信
线程的通信共有三个方法: wait()运行时阻塞,释放锁 notify()唤醒阻塞线程 notifll()唤醒全部阻塞线程 public class ThreadTest01 { public sta ...
- java_线程分类
线程分为守护线程和用户线程,如java虚拟机的回收机制就是守护线程,线程开始运行它就启动,线程结束它就结束 用户线程变守护线程:Thread(线程).setDaemon(true)
- std::function和std::bind详解
原文:https://blog.csdn.net/xiaoyink/article/details/79348806
- POJ 1664 放苹果( 递推关系 )
链接:传送门 思路:苹果m个,盘子n个.假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法. 根据 n 和 m 的关系可以进一步分析: 特殊的 n = 1 || ...
- ubuntu 16.04 数据库mysql安装与管理
1.安装mysql的客户端与服务器端 $>sudo apt-get install mysql-server mysql-client 2.管理服务 1.启动 $>sudo service ...
- CentOS6.5下编译安装LAMP环境
LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架.该框架能够满足大流量.大并发量的网站需求:当然.也可以直接使用高性能的服务器.高性能的负载均衡硬件以及CDN ...
- Python 3安装体验篇(win10)
一.下载 1.打开官网https://www.python.org/downloads/windows/,点击Python 3版本链接 2.点击win10 64位安装链接,即可下载Python安装 二 ...