配置好ndk和jni后 打开串口 /dev/ttyS2 每次 fd 都等于-1 返回打开失败
然后我去看jni里open函数发现一个flags
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate,jint flags)
并且在打开串口时有用到
jboolean iscopy;
const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
fd = open(path_utf, O_RDWR | flags);因为在java文件中并没有传入flags的参数
public SerialPort(File device, int baudrate) throws SecurityException, IOException {
mFd = open(device.getAbsolutePath(), baudrate);
Log.v("SerialPort","mFd="+mFd);
if (mFd == null) {
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}但是我把 mFd = open(device.getAbsolutePath(), baudrate);改成mFd = open(device.getAbsolutePath(), baudrate,0);
加入一个0参数
直接报错 编译不过 参数不对
之后我只能不改java文件回到jni文件夹下把 .c和.h文件中
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate,jint flags)fd = open(path_utf, O_RDWR | flags);
改成
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate)fd = open(path_utf, O_RDWR);编译通过 串口打开问题是 第一种方法为什么会报错 编译不过
jni里函数需要传入的参数为什么java不传也不会出问题
然后我去看jni里open函数发现一个flags
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate,jint flags)
并且在打开串口时有用到
jboolean iscopy;
const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
fd = open(path_utf, O_RDWR | flags);因为在java文件中并没有传入flags的参数
public SerialPort(File device, int baudrate) throws SecurityException, IOException {
mFd = open(device.getAbsolutePath(), baudrate);
Log.v("SerialPort","mFd="+mFd);
if (mFd == null) {
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}但是我把 mFd = open(device.getAbsolutePath(), baudrate);改成mFd = open(device.getAbsolutePath(), baudrate,0);
加入一个0参数
直接报错 编译不过 参数不对
之后我只能不改java文件回到jni文件夹下把 .c和.h文件中
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate,jint flags)fd = open(path_utf, O_RDWR | flags);
改成
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate)fd = open(path_utf, O_RDWR);编译通过 串口打开问题是 第一种方法为什么会报错 编译不过
jni里函数需要传入的参数为什么java不传也不会出问题
解决方案 »
- 自定义view的ANR问题
- Android连接服务器跟服务器连接数据库的问题.
- apk文件无法直接下载
- android mediaplayer 循环播放视频问题
- 定制一个android的提示框
- 求大神相助!!!,无比感动啊~~,如何将生成BitmapData数据生成JPG图片并且保存到手机本地的相册中去!
- java.lang.NoSuchMethodError: android.widget.RadioButton.setBackground求大神解决
- 在fragment里使用inflate方法初始化一个额外的时间选择器view报错
- 一个连接服务器登陆的问题,急急急
- listview adapter 控件注册点击事件,点击一个item后有其他item的这个控件响应了事件
- 百度地图定位失败,日记显示galaxy lib host missing meta-data
- 为什么android studio这么讨厌。。
JNIEXPORT jobject JNICALL Java_com_example_administator_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate)
fd = open(path_utf, O_RDWR);但是打开串口一直出错,返回 Open() fd = -1。请问博主,这可能是因为什么原因呢。
c中如何声明的, java文件中就必须如何声明. (参数类型和个数,顺序都必须要对应得上)
并且, 调用的时候, java代码调用native函数时, 参数也是必须要传对的.
编译能个, 那只是假像. Android Stuio对C代码的编译提示本身就还有很多bug的. 跟宇宙最强的VS还有很大差距的.
就像基本的函数, 比如有一个c函数, 需要返回一个int, 但在函数内部, 没有任何的return语句, 他也不会报错. 当你运行的时候, 却会直接crash.从你的描述来看, 多半就是因为这个参数导致的问题.