NDK项目示例

欢迎批评指正,谢谢。

准备:Android studio(当前是3.3.2版本),NDK工具包(下载后需要配置到studio中)

1.新建类TestNDK.java(存放的位置随意),如下

public class TestNDK {
    static {
        System.loadLibrary("testndk");
    }

    public native String getString();
}

2.打开Terminal,执行命令 cd app/src/main,进入到Main文件夹下

3.执行javah -d jni -classpath ./Java   包名.TestNDK

   然后会在main文件夹下面,生成一个jni 文件夹(与Java同级),并且会生成一个TestNDK类对应的.h文件,如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_ndk_testapp_TestNDK */

#ifndef _Included_com_example_jni_ndk_testapp_TestNDK
#define _Included_com_example_jni_ndk_testapp_TestNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_ndk_testapp_TestNDK
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_1ndk_1testapp_TestNDK_getString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4.复制.h文件到jni文件夹下,修改后缀名为.c,这一步即是创建c文件(也可以创建c++文件,后缀名为.cpp,另外语法略有不同),实现与用native定义的java方法的对应的c方法,

如下,只有方法体被改动,返回了一个字符串

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_ndk_testapp_TestNDK */

#ifndef _Included_com_example_jni_ndk_testapp_TestNDK
#define _Included_com_example_jni_ndk_testapp_TestNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_ndk_testapp_TestNDK
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_1ndk_1testapp_TestNDK_getString
  (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"Hello from c!");
}

#ifdef __cplusplus
}
#endif
#endif

 5,在jni文件夹下,新建Android.mk文件和Application.mk文件

 Android.mk文件,内容如下 

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testndk//要生成的so文件的名字
LOCAL_SRC_FILES := TestNDK.c//要编译的c源文件,如果是多个c文件的话用\分割就行了如:=TestNDK.c\TestNDK1.c, \ 两边要留有空格
include $(BUILD_SHARED_LIBRARY)

Application.mk文件,内容如下 

APP_ABI := armeabi//指定要生成那些cpu架构类型的so文件

6.右键moudle(这里是app),选择 Link C++ Progect  with Gradle -> 选ndk-build 和 Android.mk 文件,该moudle下的gradle文件会多出如下内容(在android{}下,和defaultConfig 同级)

externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
}

 7.在 build / intermediates / ndkBuild  下即可找到生成的so文件。

实例化 TestNDK 的对象,调用getString方法,即可获取返回值。

参考文章:https://www.jianshu.com/p/eae320ee9b2d

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值