设计NDK程序
分为3步
1.编写头文件
2.编程源程序
3.编写MAKEFILE
但是头文件是用相应的命令自动产生的
源文件就是我们自己写的.c或者.c++
最后就是编写我们android.mk这个makefile
JNI是JAVA语言调用我们C和C++的提供的一种通道一种机制 这种机制就是因为JAVA语言的弊端 NDK可以更加方便的为我们的JNI的程序开发提供帮助 这个程序的设计流程是比较固定的
产生头文件,产生头文件的依据就是我们应用程序,应用程序会调用到C程序的接口, 所以真正的开始是NDK的开发者与应用程序开发者做到一起把接口给规定好 规定好之后应用开发的开发应用程序,应用程序开发到一定程序之后,NDK开发者利用应用程序产生这个头文件,所以说产生头文件是利用这个APP来产生的。我们拿一个开发好的应用程序来开发你的NDK来产生头文件。下一节再讲应用程序的开发
在local.properties进行修改
改好之后启动我们androidstudio
把这个工程倒进来
然后rebuild projiect
编译完之后不关它回到linux系统中去
接下来就是产生头文件了,我们可以利用已经编译好的一些文件来产生出头文件
具有命令如下
javah -d jni 有了这些命令之后就会在我们运行这条命令平行的目录下产生一个JNI的目录,我们头文件也会放到这个目录下,然后接上-classpath 跟上你的androidsdk下的android.jar这个包所在的全路径,后面跟刚编译应用程序的路径 然后是应用程序的主类(路径也要给出来就是包的名字)
包的名字就是这个
我的运行如下
然后你可以看到在这个目录下有个jni目录而且下面还有东西,如下
查看这个文件的最后一行
这里表明在我们应用程序里面用到了一个库里面的函数,就是马上要去实现的C库里面的函数,这个函数名字,叫做Java_com_android_jack_ndk_happy_MainActivity_cmdLeds 这个名字,这个名字虽然有点长,但是是固定的
JAVA+包路径的类名+函数名,后面是它四个参数,待会我的库里面要去实现这个函数
第一步已经产生了,接下来我们编译源文件
/刚创建的头文件肯定是要包含的
#include "com_android_jack_ndk_happy_MainActivity.h"
//Linux下的头文件也要被包含
#include <jni.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#define LED_MAGIC 'L'
#define LED_ON _IO(LED_MAGIC,0)
#define LED_OFF _IO(LED_MAGIC,1)
//这个函数是控制我们led,给出来的参数,前面两个是JAVA语音自动给我们加的,我们不用去管他,第一个参数是
cmd,后面是arg
JNIEXPORT void JNICALL Java_com_android_jack_ndk_happy_MainActivity_cmdLeds
(JNIEnv *env, jobject this, jint cmd, jint arg);
{
int fd;
int temp_cmd;
fd = open("/dev/led_driver",O_WRONLY);
if(cmd==1)
{
temp_cmd=LED_ON;
}
else if(cmd==0)
{
temp_cmd=LED_OFF;
}
ioctl(fd,temp_cmd,arg);
close(fd);
}
第三个就是编写makefile
安卓的make名字叫Android.mk 固定的名字 别的名字会报错的
然后退到上层去运行这个命令 ndk-build
提示信息可以看到这个so文件被安装到了libs/armeabi/这个目录下面
产生了这个.so
这个就是NDK的程序库