安卓复习之旅—使用NDK进行JNI编程
来源:互联网 发布:冬天去哈尔滨 知乎 编辑:程序博客网 时间:2024/06/10 15:50
jni编程是进阶必不可少的技能,今天就一起回顾一下使用NDK进行jni编程的步骤:
step1.下载配置NDK
具体怎么配置我就不啰嗦了,提供一个下载地址:http://pan.baidu.com/s/1mhMX70O
step2.声明native方法
新建一个类,声明native方法:
/** * 声明native方法 */public class JniTest { static { System.loadLibrary("jni-test"); } public static void main(String args[]) { JniTest jniTest = new JniTest(); System.out.print(jniTest.getFromJni()); jniTest.setIntoJni("hello world"); } public native String getFromJni(); public native void setIntoJni(String info);}
由native 修饰的就是我们声明的本地方法:
step.3编译源文件得到.class文件,导出.h头文件
先看看工程目录:D:/as/UIdemo/JniDemo/jni_lib/src/main/java/com/example/jniTest.java
通过cmd 进入到合适的目录位置,为什么会说合适的位置呢,因为如果不在合适的位置的话 后面的javah命令可能会报一些错,这里我们进入到D:/as/UIdemo/JniDemo/jni_lib/src/main/java这个目录就可以了,然后进行编译:
这样就得到了.class文件和.h头文件:
进入.h文件中看看是怎样的:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_lin_jnidemo_JniTest */#ifndef _Included_com_lin_jnidemo_JniTest#define _Included_com_lin_jnidemo_JniTest#ifdef __cplusplusextern "C" {#endif/* * Class: com_lin_jnidemo_JniTest * Method: getFromJni * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_lin_jnidemo_JniTest_getFromJni (JNIEnv *, jobject);/* * Class: com_lin_jnidemo_JniTest * Method: setIntoJni * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_lin_jnidemo_JniTest_setIntoJni (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif
- 在.h头文件中函数名格式是Java_包名类名方法名;
- JNIEnv *表示一个指向JNI环境的指针,通过它可以访问JNI接口提供的方法;
- jobject:表示Java中的this;
- JNIEXPORT 和 JNICALL:JNI中所定义的宏;
- extern “C”:表示内部的函数采用c语言的命名风格来编译
step4.实现声明的native方法,配置Android.mk和Application.mk文件
在工程的主目录下创建一个子目录,然后将.h头文件复制到此目录中,接着创建test.c、Android.mk和Application.mk文件;
test.c如下:
/*#include是编译预处理指令,就是在编译前将stdio.h这个文件里的函数都添加到你写的cpp文件中,然后参与编译,生成.obj文件。如果没有这个指令,你用到的一些方法时编辑器就会报错:*/#include <jni.h>#include <stdio.h> jstring Java_com_lin_jnidemo_JniTest_getFromJni (JNIEnv *env, jobject thiz){ printf("getFromJni is load") return (*env)->NewStringUTF(env, "i am from jni "); }; void Java_com_lin_jnidemo_JniTest_setIntoJni (JNIEnv *env, jobject thiz, jstring string){ printf("setIntoJni is load") (*env)->ReleaseStringUTFChars(env, string, "setintojni"); };
Android.mk
LOCAL_PATH:= $(call my-dir)#清除之前的一些系统变量include $(CLEAR_VARS)# 编译的源文件LOCAL_SRC_FILES:=test.c# 编译生成的目标对象 用来给java调用的模块名,LOCAL_MODULE := jni-test#指明要编译成动态库include $(BUILD_SHARED_LIBRARY)
Application.mk:
#默认情况下NDK会编译产生各个CPU平台的so库#指定so库的CPU平台的类型 all标识编译所有平台APP_ABI := all
APP_ABI 可以指定so库的CPU平台的类型,常见的架构平台有armeabi,x86和mips,编译的时候尽量这三种都编译,以免在不同cpu平台报出UnsatisfiedLinkError 错误;
5.通过ndk-build命令编译产生so库文件
准备工作已经差不多了,接下来通过ndk-build命令编译产生so库文件:
这个时候在主目录会自动生成libs目录和obj目录,里面装的就是生成的so库文件:
到此一个基本的通过NDK进行JNI编程就完成了,看一下运行效果:
github
- 安卓复习之旅—使用NDK进行JNI编程
- 使用NDK进行JNI编程
- 安卓使用JNI-NDK
- JNI和NDK编程-使用AndroidStudio进行NDK开发
- 安卓 NDK与JNI
- 安卓 NDK JNI 使用(五) -- so , jar 包
- 在安卓JNI/NDK中使用C++11
- 安卓开发中学习使用ndk开发jni注意事项
- 开始安卓编程使用NDK
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
- 安卓开发之JNI编程详解
- 安卓 NDK JNI 使用(一) -- 环境配置(AS NDK cygwin)
- 安卓 NDK JNI 使用(二) -- 新的NDK项目(实现 a + b)
- 使用Android Studio2.2进行NDK编程在现有工程中添加JNI
- 安卓---JNI使用
- 二. JNI编程与Android NDK - 安卓程序中调用C写的库
- Android NDK编程之JNI探究
- rem.js
- No mapping found for HTTP request with URI
- CallingConvention 成员
- Android--焦点问题以及讨论事件传递机制问题(结合部分相关源码)
- win10家庭版下面修改配置host文件虚拟主机
- 安卓复习之旅—使用NDK进行JNI编程
- Android的死机、重启问题分析方法
- 安卓高级组件-------选项卡
- 你好!CSDN
- Android 之 zoey
- 定义一个带参数的宏,求出三个数中最大的一个数
- 6.10、提取extract、与聚合(sum、aggregate、avg)
- socket数据协议包
- Comparable接口和Comparator接口