最近开发Android的过程中需要通过C来调用Android终端中的某些API,而我是用JAVA语言来开发的Android程序,所以就需要用到JNI调用。

流程是,用C来调用Android硬件接口,约定JAVA调用C的接口,然后把这些代码封装编译成.so文件。然后就是怎么引入与调用了。


1、将.so文件加入到libs目录下,.so文件命名规范为lib*,lib后加上名字。

2、加入jniLibs路径配置,在build.gradle中加入如下配置:

android{……sourceSets{main{jniLibs.srcDirs=['libs']}}}

3、JAVA调用

publicclassUspJni{privatefinalstaticStringTAG="USPJNI";static{try{System.loadLibrary("uspjni");//加载libuspjni.soLog.d(TAG,"libuspjni.soload");}catch(Exceptione){System.err.println("Nativecodelibraryfailedtoload.\n"+e);}}publicstaticUspJnigetInstance(){if(jni==null){jni=newUspJni();}returnjni;}publicintuartOpen(Stringpath,intflags){Log.d(TAG,"(uartOpen)path="+path+",flags="+String.valueOf(flags));uartFd=this.open(path,flags);if(uartFd<0){Log.d(TAG,"(uartOpen)failed"+",uartFd="+String.valueOf(uartFd));}returnuartFd;}publicintuartClose(){Log.d(TAG,"(uartClose)");intstatus=this.close(uartFd);uartFd=-1;if(status!=0){Log.d(TAG,"(uartClose)failed,status="+String.valueOf(status)+",uartFd="+uartFd);}returnstatus;}publicbyte[]uartRead(inttimeout){Log.d(TAG,"(uartRead)timeout="+timeout);byte[]buff=this.read(uartFd,timeout);if(buff==null){returnnewbyte[0];}Log.d(TAG,"(uartRead)len="+buff.length);returnbuff;}publicintuartFlush(){Log.d(TAG,"(uartFlush)");byte[]data;do{data=UspJni.getInstance().uartRead(50);//调用}while(data.length>0);return0;}publicnativeintgpioSetStatus(intioId,intstatus);publicnativeintgpioGetStatus(intioId);privatenativeintopen(Stringpath,intflags);privatenativeintclose(intfd);privatenativebyte[]read(intfd,inttimeout);privatenativeintwrite(intfd,byte[]data,intcount);privatestaticUspJnijni;privateUspJni(){}}