上一篇文章介绍了利用eclipse来进行ndk开发生成so文件,该文章介绍利用终端命令行生成so文件,并补充NDK环境下载配置。
1. 电脑上需要下载相应版本的ndk,我是用的是android-ndk-r14b-windows-x86_64版本,相应的版本下载请参考博文,该博主太伟大了,整理了出来。下载之后直接解压放在固定目录即可;
2. 将ndk-build.cmd所在的目录添加到系统变量当中,之后再利用终端生成so文件时,直接在工程目录下面敲ndk-build即可,不需要再去指定它所在的目录,增加系统变量方法不在详细介绍,简单而且教程很多,添加结果下图所示:
再终端输入ndk-build -h出现一些帮助提示说明如下图,说明ndk开发环境配置完成,如果步骤正确没出现,电脑重启一次试一下,我第一次是这样解决的,这里需要注意的是高版本的NDK添加的目录一定是添加到build文件夹,根文件夹下运行ndk-build会报错的。
3. 利用eclipse建立一个安卓工程,然后在工程目录下新建一个jni文件夹用来存放c/c++和mk文件,在上一篇的方法是利用eclipse自动生成的
4. 编写MainActivity内容,加载库,调用静态方法,我的示例代码如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText(String.valueOf(getNum()));
setContentView(tv);
}
private native int getNum();
static {
System.loadLibrary("Abcd");
}
}
5. 利用javah生成项目的h头文件,在编写c++文件时要用到,利用javah可以在终端任意目录下使用,但需要配置加载类的路径-classpath,还有就是设置生成存放目录,所以我就用的懒汉模式,直接在工程的src目录下执行javah -jni com.example.abcd.MainActivity(包名+相应的类名)即可生成com_example_abcd_MainActivity.h文件,生成的文件是在src目录下,你在复制到jni文件夹下面就ok了
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_abcd_MainActivity */
#ifndef _Included_com_example_abcd_MainActivity
#define _Included_com_example_abcd_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_abcd_MainActivity
* Method: getNum
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_example_abcd_MainActivity_getNum
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
6. 编写c++的方法实现
#include <jni.h>
#include <com_example_abcd_MainActivity.h>
jint Java_com_example_abcd_MainActivity_getNum
(JNIEnv *,jobject) {
return 666;
}
需要注意一定要包含#include <com_example_abcd_MainActivity.h>声明,否则会报错找不到getNum方法,其次是编写Android.mk和Application.mk文件,参照上一篇方法即可
7. 在工程目录下,子目录下也可以,在终端输入ndk-build命令即可完成so文件生成。
8. 在eclipse中运行程序就可以了,效果如下
注意:在执行过终端命令后,如果eclipse里面的工程没有显示生成的文件,记得右键 刷新工程,或者快捷键F5刷新即可。
Windows终端查看文件列表命令是dir,而不是ls,切换盘符是直接盘符回车(d:)