配置好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不传也不会出问题

解决方案 »

  1.   

    在我的C文件里直接就是这种的,并没有flag
    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。请问博主,这可能是因为什么原因呢。
      

  2.   

    对与jni函数.
    c中如何声明的, java文件中就必须如何声明.  (参数类型和个数,顺序都必须要对应得上)
    并且, 调用的时候, java代码调用native函数时, 参数也是必须要传对的. 
    编译能个, 那只是假像.  Android Stuio对C代码的编译提示本身就还有很多bug的.  跟宇宙最强的VS还有很大差距的.
    就像基本的函数, 比如有一个c函数, 需要返回一个int, 但在函数内部, 没有任何的return语句, 他也不会报错. 当你运行的时候, 却会直接crash.从你的描述来看, 多半就是因为这个参数导致的问题.