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
LOCAL_SRC_FILES:=NDKTest.cpp
include $(BUILD_SHARED_LIBRARY)
使用ndk-build
使用Terminal进入jni目录下,输入: ndk-build 不出意外会生成一个libs目录,生成所有平台下的so库 现在我们要把src目录下边的所有文件拷贝到项目根目录的libs目录
然后需要在gradle中指定so库文件的路径,一定要
source Sets {
main {
jniLibs.srcDirs = ['libs' ]
}
}
- 添加到app的gradle
static {
System.loadLibrary("NDKTest" );
}
添加C++方法
如果需要添加额外的方法,需要重新生成头文件,然后再cpp里边添加方法,最后再次运行: ndk-build 命令