Android NDK开发入门实例

   原生开发工具包(NDK)是在Android应用中调用C或C++代码的工具。在普通app中实用性不高,但是作为Android开发者也应该有一些了解。下面给大家提供一个小例子借大家学习。
  先安装ndk,打开Tools->Android->SDK Manager->SDK Tools选中LLDB和NDK,点击确认,软件会自动安装NDK。
  新建工程FirstNdkDemo,配置Module下的build.gradle文件,在defaultConfig中加入:
ndk {
     moduleName "demo"  //生成的so名字
     abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
}
sourceSets.main{
     jni.srcDirs = []
     jniLibs.srcDir "src/main/libs"
}

如下图:
这里写图片描述

  新建java类JniTest.java,里面写原生方法:
  JniTest代码:
public class JniTest {
    static {
        System.loadLibrary("demo");
    }
    public native String getName();

}

先静态加载library,”demo”就是我们build.gradle中命名的.so库的名字
这里注意关键字native。这里只是声明,实现是通过C或C++来实现。

接下来是生成.h文件,如果没有在Android Studio中配置ndk命令的话,可以看我另一篇博客
Android Studio NDK开发命令配置
当然也可以直接javah命令,稍微麻烦一点,需要先build工程,然后在build目录中找到class文件,再执行javah命令,复制.h文件拷贝到jni目录。
.class文件位置

下面是生成后.h文件:
这里写图片描述

生成的.h文件中的方法名Java_com_example_ndkdemo_firstndkdemo_JniTest_getName实际上就是Java_包名类名方法名。

下面在jni目录下新建.c文件first.c,

#include "com_example_ndkdemo_firstndkdemo_JniTest.h"

JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_firstndkdemo_JniTest_getName
        (JNIEnv *env, jobject jobject1) {
    return (*env)->NewStringUTF( env,"hello my first jni");
}

新建Android.mk文件,用于向构建系统描述源文件和共享库。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := demo
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE与build.gradle中.so文件的命名一致,生成的就是.so文件的名称。
LOCAL_SRC_FILES指向的是你的.c文件

 新建Application.mk文件,用于描述应用需要的原生模块。
APP_MODULES := demo
APP_ABI := all

通过配置的ndk-build生成.so文件:
这里写图片描述

生成后的目录:
这里写图片描述

接下来就是调用.c文件中的方法:
MainActivity中调用:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((TextView) findViewById(R.id.tv_jni)).setText(new JniTest().getName());
    }
}

运行结果:
这里写图片描述

github地址
csdn下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值