1.TextView 滚动拉动
2.byte 转 Strings
3. Thread
4.Handle
<?xml version="1.0" encoding="UTF-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/receiveTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/sendSerial"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send" />
<Button
android:id="@+id/clearButton"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clear" />
<Button
android:id="@+id/openSerial"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OPEN" />
<Button
android:id="@+id/closeSerial"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Close" />
</LinearLayout>
<EditText
android:id="@+id/sendEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/showTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" "
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
</ScrollView>
</LinearLayout>
package com.friendlyarm.LEDDemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.EditText;
import android.widget.Toast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import java.util.Arrays;
import android.widget.TextView;
import com.friendlyarm.AndroidSDK.HardwareControler;
public class serial extends Activity{
private TextView fdText;
private TextView showText;
private EditText sendEditText;
private Button closeSerial;
private Button sendSerial;
private Button openSerial,clearShow;
private int fd;
protected static final int SHOWDATA = 0x1234;
protected static final int SENDOK = 0x1235;
public Handler mHandler;
private boolean threadDisable=false;
String recdata;
/**
*接收函数
*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.serial);
fdText=(TextView) findViewById(R.id.receiveTextView);
showText=(TextView) findViewById(R.id.showTextView);
sendEditText=(EditText) findViewById(R.id.sendEditText);
closeSerial = (Button) findViewById(R.id.closeSerial);
sendSerial = (Button) findViewById(R.id.sendSerial);
openSerial = (Button) findViewById(R.id.openSerial);
clearShow = (Button) findViewById(R.id.clearButton);
closeSerial.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
//TODO Auto-generated method stub
HardwareControler.close(fd);
fdText.setText("关闭串口");
openSerial.setEnabled(true);
threadDisable = true;
}
});
openSerial.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
//TODO Auto-generated method stub
fd=HardwareControler.openSerialPort("/dev/s3c2410_serial3",115200,8,1);
if(fd !=-1)
Toast.makeText(serial.this,"OPEN SUCCESS", Toast.LENGTH_SHORT).show();
else
Toast.makeText(serial.this,"OPEN FAIL```", Toast.LENGTH_SHORT).show();
fdText.setText(Integer.toString(fd));
fdText.setText(fdText.getText() + "打开线程");
openSerial.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
while (!threadDisable) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int m=HardwareControler.select(fd,0,0);
if(m==1)
{
byte[] buf =new byte[1024];
try {
Thread.sleep(10);
} catch(InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
int n = HardwareControler.read(fd, buf, 1024);
String ss = new String(buf,0,n);//将bytes转为 String
Message s = new Message();//定义一个message的变量m
s.what = serial.SHOWDATA;//消息的标记GUINOTIFIER在前面定义的
s.obj =ss; //将要传送的数据传递给 m.obj
serial.this.mHandler.sendMessage(s);//传送消息
}
}
}
}).start();
}
});
/**
* 发送按钮
*/
sendSerial.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
SendSerial();
}
});
clearShow.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
showText.setText("");
}
});
//创建handler
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {//得到Handle的通知了 这个时候你可以做相应的操作
case serial.SHOWDATA://tcp_server是Activity的类名
//receivedata_tv.setText("");//清空textView
//recv_tv.setText(msg.obj.toString());//设置textView显示内容 每次都清除上次的显示
showText.setMovementMethod(new ScrollingMovementMethod());
showText.append(""+ msg.obj.toString());//设置textView显示内容 下一行接着显示
break;
// case serial.SENDOK:
//.setText("");
}
super.handleMessage(msg);
}
};
}
public void SendSerial(){
HardwareControler.write(fd,sendEditText.getText().toString().getBytes());
sendEditText.setText("");
};
}
package com.friendlyarm.AndroidSDK;
import android.util.Log;
public class HardwareControler
{
/* Serial Port */
static public native int openSerialPort( String devName, long baud, int dataBits, int stopBits );
/* LED */
static public native int setLedState( int ledID, int ledState );
/* PWM */
static public native int PWMPlay(int frequency);
static public native int PWMStop();
/* ADC */
static public native int readADC();
/* I2C */
static public native int openI2CDevice();
static public native int writeByteDataToI2C(int fd, int pos, byte byteData);
static public native int readByteDataFromI2C(int fd, int pos);
/* 通用接口 */
static public native int write(int fd, byte[] data);
static public native int read(int fd, byte[] buf, int len);
static public native int select(int fd, int sec, int usec);
static public native void close(int fd);
static {
try {
System.loadLibrary("friendlyarm-hardware");
} catch (UnsatisfiedLinkError e) {
Log.d("HardwareControler", "libfriendlyarm-hardware library not found!");
}
}
}
相关推荐
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
赠送jar包:zstd-jni-1.3.2-2.jar; 赠送原API文档:zstd-jni-1.3.2-2-javadoc.jar; 赠送源代码:zstd-jni-1.3.2-2-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.2-2.pom; 包含翻译后的API文档:zstd-jni-...
总结来说,Android开发中的JNI调用第三方.so库,需要通过CMakeLists.txt配置C/C++构建过程,设置源码、库依赖,并在Java层定义对应的JNI接口。CMakeLists.txt与build.gradle文件的配合使得整个过程自动化,大大简化...
当你创建一个新的Android项目时,如果没有这个目录,可以在app/src/main目录下手动创建一个名为jniLibs的目录,并根据不同的CPU架构(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64)创建对应的子目录,分别放置...
总结来说,"Android使用JNI调用Python so解释器"涉及到Android NDK开发,JNI接口设计,Python解释器的Android移植,以及跨语言通信等多个技术层面。这种技术虽然复杂,但能充分利用Python的灵活性和Android的广泛...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
5. **打包.so文件**:生成的.so文件需要被包含到Android应用的APK中,通常放在项目的`jniLibs`目录下,不同架构的文件放在相应的子目录中,如`armeabi-v7a`、`arm64-v8a`等。 6. **在Java代码中调用**:在Android...
- 对于旧版的NDK项目,需要在jni目录下创建一个名为Android.mk的文件,来指定编译的目标、源文件和依赖库。 - 对于使用CMake的新版NDK项目,需要在CMakeLists.txt文件中添加对应的规则。 2. **编译.so库**: - ...
这个"onnxruntime-android so文件"是该引擎的一部分,主要包含预编译的库文件,使得开发者能够在Android应用中集成ONNX Runtime,以执行优化过的ONNX模型。 1. ONNX(Open Neural Network Exchange):ONNX是一种...
本文将详细介绍如何使用Android Studio(AS)生成.so文件,并将其引入到其他项目中进行调用。 首先,我们需要了解JNI(Java Native Interface)的概念。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的...
Android JNI(Java Native Interface)和NDK(Native Development Kit)是Android平台开发中的重要组成部分,它们允许开发者在Java代码中调用C/C++原生代码,实现高性能计算、利用硬件加速或者集成第三方C/C++库。...
在Android系统中,由于安全和权限限制,直接操作串口并不像在桌面系统那样简单,因此通常需要通过JNI(Java Native Interface)或者NDK(Native Development Kit)来调用本地库(.so文件)进行处理。 在描述中提到...
面向开发者的libagora-rtc-sdk-jni.so资源文件,方便各位下载使用libagora-rtc-sdk-jni.so
在Android开发中,SDK、NDK以及JNI是三个至关重要的组件,它们共同构成了Android平台上的原生代码开发环境。下面将详细阐述这三个概念及其在Android应用开发中的作用。 首先,Android SDK(Software Development ...
总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/C++编译环境,以及在Unity中适当地引入和调用SO文件。这个过程涉及到Android NDK开发、JNI编程以及Unity的插件集成,需要对这几个方面都有...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种方法,可以在Java应用程序中调用本地(非Java)代码,同时也允许本地代码调用Java对象。这个压缩包“JNI.rar”包含了关于Android...
本项目“android串口程序 含有串口静态库.so文件”提供了一个这样的解决方案,它包含了能够运行在手机设备上的串口通信功能。这里的重点是静态库 `.so` 文件,它是Android Native Development Kit (NDK) 开发的一...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。这个技术尤其在需要高效计算或者调用系统底层功能时显得尤为重要。本示例将详细介绍如何通过JNI调用第三...