设计NDK程序

来源:互联网 发布:犀牛软件雕花教程 编辑:程序博客网 时间:2024/06/05 18:18

分为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的程序库




原创粉丝点击