Android Studio下Java Jni技术

2016-12-21 10:03:55来源:http://xuepiaoqiyue.blog.51cto.com/4391594/1884139作者:雪飘七月人点击


最近开发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.so
Log.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()
{

}
}

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台