NDK的用法
来源:互联网 发布:圆筒的体积怎么算c语言 编辑:程序博客网 时间:2024/06/05 08:40
NDK是SDK的辅助工具,用它将Android的一部分或全部用本地代码实现。字节码需要由虚拟机解释,而本地代码由设备处理器直接执行,执行速度更快。Dalvik的JIT编译器可以将字节码编译为本地代码,减少字节码的解释次数,而直接使用自己生成的本地代码可以让应用运行的更快。
使用步骤:
1)在Java代码中声明本地方法
2)实现JNI粘合层
3)创建Android makefile文件
4)用C/C++实现本地方法
5)编译本地库
6)加载本地库
1、示例展示NDK用法
1)Fibonacci.java
package com.example.sometest;public class Fibonacci {public static native long recursiveNative(int n);}2)打开命令行,切换到应用目录,创建jni目录执行
javah -classpath bin/classes -jni -d jni com.example.sometest.Fibonacci
自动生成头文件:com_example_sometest_Fibonacci.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_sometest_Fibonacci */#ifndef _Included_com_example_sometest_Fibonacci#define _Included_com_example_sometest_Fibonacci#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_sometest_Fibonacci * Method: recursiveNative * Signature: (I)J */JNIEXPORT jlong JNICALL Java_com_example_sometest_Fibonacci_recursiveNative (JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif创建com_example_sometest_Fibonacci.c
#include "com_example_sometest_Fibonacci.h"#include "fibonacci.h"/* * 类:com_example_sometest_Fibonacci * 方法:recursiveNative * 签名:(I)J */jlong JNICALLJava_com_example_sometest_Fibonacci_recursiveNative (JNIEnv *env, jclass clazz, jint n){return recursive(n);}3)创建makefile
Application.mk,指定了构建一个版本的库(EABI: embeded application binary interface)
APP_ABI := armeabi
Android.mk,LOCAL_SRC_FILES列出了所有需要编译的文件,LOCAL_MODULE定义了模块的名称。
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := fibonacciLOCAL_SRC_FILES := com_example_sometest_Fibonacci.c fibonacci.cinclude $(BUILD_SHARED_LIBRARY)4)实现本地函数
新建fibonacci.h
#ifndef _FIBONACCI_H_#define _FIBONACCI_H_#include <stdint.h>extern uint64_t recursive (unsigned int n);#endif
新建fibonacci.c
#include "fibonacci.h"uint64_t recursive (unsigned int n){if(n>1) return recursive(n-2)+recursive(n-1);return n;}
从粘合层调用该函数
5)编译本地库下载并解压NDK,将NDK目录加到PATH环境变量,从而方便使用ndk-build命令构建共享库。
将命令行当前路径切换至jni目录,执行ndk-build,最终在libs/armeabi生成libfibonacci.so共享库。
6)加载库
public class Fibonacci {static{System.loadLibrary("fibonacci");}public static native long recursiveNative(int n);}7)然后本地方法就可以使用了,不再报异常UnsatisfiedLinkError
MainActivity.java
public class MainActivity extends Activity{private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.d(TAG, "onCreate");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void onClick(View v){switch(v.getId()){case R.id.btn_getValue:Toast.makeText(this, "fibonacci="+Fibonacci.recursiveNative(4), Toast.LENGTH_SHORT).show();}}}activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:id="@+id/btn_getValue" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="getValue" android:onClick="onClick"/></LinearLayout>
1 0
- ndk-build的用法
- NDK的用法
- ndk-build的用法
- NDK malloc的用法导致问题
- NDK Build 用法
- NDK-build用法
- ndk-build用法
- 12.Android之NDK Android.mk的用法与基础
- Android NDK中socket的用法和注意事项
- Android NDK中socket的用法和注意事项
- Android NDK中socket的用法和注意事项
- Android-Ndk环境配置&转.h so文件的用法
- NDK Build 用法(NDK Build)
- NDK Build 用法(NDK Build)
- NDK Build 用法(NDK Build)
- NDK Build 用法(NDK Build)
- NDK Build 用法(NDK Build)
- NDK Build 用法(NDK Build)
- 黑马程序员_IO流的总结
- c语言之小括号
- python网络爬虫实践出真知(1)
- sas默认语言修改
- DICOM:fo-dicom之C-STORE再分析‘解决System.ObjectDisposedException异常’
- NDK的用法
- hdu1506一维木板动归
- servlet小知识点(1)
- HTTP报文
- jQuery Mobile的学习时间botton按钮的事件学习
- bzoj3524 区间问题
- Linux下删除低版本的Python异常
- git给自己
- 动态规划10_数位DP2