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 ...
随机推荐
- (转)淘淘商城系列——SSM框架整合之Service层整合
http://blog.csdn.net/yerenyuan_pku/article/details/72721108 上文我们一起学习了Dao层的整合,本文将教大家如何整合Service层. 我们需 ...
- java将很长的一条sql语句,自动换行输出(修改版)2019-06-01(bug未修复)
package org.jimmy.autosearch2019.test; import java.util.HashMap; public class AutoLinefeedSql { publ ...
- Android反编译初步
网上关于Android反编译的帖子很多,反编译的步骤也是很详细,本文Android反编译参考博客:https://www.cnblogs.com/dhcn/p/7120891.html 而反编译中最主 ...
- [Luogu] P4838 P哥破解密码
题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...
- VSCODE插件开发:用户输入输出
阅读这篇文章之前,假设你已经具有开发helloworld的插件的能力. vscode.window 简介 vscode.window 负责当前激活窗口的输入输出,比如展示信息,和用户输入等功能都是用v ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- RNNCell使用
目录 Recap input dim, hidden dim SimpleRNNCell Single layer RNN Cell Multi-Layers RNN RNN Layer Recap ...
- jquery点击事件
$("#hoetelNameSelect").click( $.post("${ctx}/meeting/restaurant/queryHotelName", ...
- LeetCode(70) Climbing Stairs
题目 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cli ...
- Android BGABadgeView:显示提示数字(2)
Android BGABadgeView:显示提示数字(2) 在附录文章3的基础上,对代码进行稍微改造,显示在红色小圆球内部显示数字,同时给红色小圆球通过可编程调控红色小圆球的整体外观,布局文件 ...