NDK开发(一)--ndk-build

1.使用cmake方式编译ndk程序已经写在CSDN博客中

NDK开发随手笔记

2.今天记录不使用cmake方式,使用ndk自带的ndk-build来生成so库文件。


新建文件

  • 首先在AS中新建一个app,然后建立的时候添加对C++的支持
  • 完成之后我们在project试图下的 app/src/main 下边新建一个jni文件夹,我们的所有跟c/c++有关的代码、头文件都放在这个文件夹内部。
  • 我们新建一个NDKTest.java类,在这个类中我们使用jni,首先定义一个Java调用C++的函数
public native String helloJNI();

生成头文件

  • 然后就要使用我们的javah命令了,在AS下边的Terminal中端进入到项目的src目录下运行如下命令来生成jni方法的头文件
javah -d jni -classpath java xxxx.xxx.xxx.NDKTest

-d:        指定.h头文件存放的路径
jni:        存放头文件的文件夹
-classpath: 指定类文件的地方
java:      指的是src下边的java文件夹
  • 然后得到我们的以包名+类名命名的头文件,然后就是使用里边的一个方法如下
JNIEXPORT jstring JNICALL Java_com_yujie_italker_ndktest_NDKTest_helloJNI
  (JNIEnv *, jobject);
  • 接下来在jni目录创建我们的c++文件,新建NDKTest.cpp文件。将我们刚才生成的头文件导进来,还有jni.h也要导进来。将上步提到的方法复制进来,同时加上参数和大括号:
JNIEXPORT jstring JNICALL Java_com_yujie_italker_ndktest_NDKTest_helloJNI
        (JNIEnv *env, jobject obj){

    return env ->NewStringUTF("this is ndk test");
}

创建Android.mk

  • 我们需要在jin目录下创建一个Android.mk文件来编译我们的so库使用。最简单的示例如下:
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=NDKTest  //要生成的so库的名字,其他的默认

LOCAL_SRC_FILES:=NDKTest.cpp //我们刚才写的cc++文件

include $(BUILD_SHARED_LIBRARY)

使用ndk-build

  • 使用Terminal进入jni目录下,输入: ndk-build
  • 不出意外会生成一个libs目录,生成所有平台下的so库
  • 现在我们要把src目录下边的所有文件拷贝到项目根目录的libs目录

然后需要在gradle中指定so库文件的路径,一定要

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
- 添加到app的gradle
  • 最后我们就可以在刚才写的Java文件中导入库文件
static {
        System.loadLibrary("NDKTest");//此处就是我们生成的so库libNDKTest.so 这里我们只写名称
    }

添加C++方法

  • 如果需要添加额外的方法,需要重新生成头文件,然后再cpp里边添加方法,最后再次运行: ndk-build 命令

你可能感兴趣的:(Android,ndk,cmake,jni)