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 ...
随机推荐
- 在PetaPoco中使用Where in
之前一直没在意,今天查了很多资料,才知道在petapoco中使用in关键字需要使用命名参数,否则是无效的(或者只查出第一个条件的记录),示例如下: var tags= new string[]{“c1 ...
- centos7.2密码在单用户下面的修改
centos7.2在但用户模式下面的修改 1.开机启动 2.grub模式按E健 3.Linux16行的"ro"修改为 "rw init=/sysroot/bin/sh&q ...
- Codeforces_B.Maximum Sum of Digits
http://codeforces.com/contest/1060/problem/B 题意:将n拆为a和b,让a+b=n且S(a)+S(b)最大,求最大的S(a)+S(b). 思路:考虑任意一个数 ...
- element-UI el-table添加序号列时序号永远都是从1开始?
Part.1 示例 当我们想在 el-table 中添加序号列时,如下: <el-table-column label="序号" type="index" ...
- redis新特性
摘自<redis 4.xcookbook> 从实例重启同步] 故障切换同步] 4.0之前从实例主键过期bug redis4新特性 Memory Command Lazy Free PSYN ...
- C89:应用篇 文件管理器
一.简介 用C语言做的一个文件管理器的轮子,因为经常开发中会用到跟数据流有关的,做完会放到Github上
- notepad++新建文档时,会出现语法错误的红色下波浪线
notepad++新建文档时,会出现语法错误的红色下波浪线: 原因:新建文档时默认设置语言为PHP. 解决方法:修改默认语言为java或JavaScript,如下: 小结:打开文档时,也可能出现下波浪 ...
- linux 服务脚本
#!/bin/bash # # chkconfig: # description: my_SERVICE_NAME is a my Service # # common function . /etc ...
- HDU - 2102 A计划(双层BFS)
题目: 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚, ...
- [转]ionic或者angularjs中图片显示压缩问题解决 or 显示较大图片的某一块区域、裁剪显示
我们知道在html中显示图片一般都是用img控件标签,当然调整大小的也很容易. 但是会出现,特定的img大小,显示一张比较大尺寸的且长宽比例与特定img大小不相符的图片.而导致压缩问题,图片挤压的很严 ...