JNI C函数无法解析串口Api android

时间:2017-03-06 21:17:58

标签: java android c android-ndk serial-port

我正在使用serial-port-api为android开发应用程序。我已经安装了NDK,下载了库并将其包含在内。像SerialPortFinder.getAllDevicesPath()这样的函数非常有效。但位于api文件 SerialPort.java 中的这部分代码标记为红色:

// JNI
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
public native int getmodemlines();

问题叫做

  

无法解析相应的JNI函数Java_android_1serialport_1api_SerialPort_open   报告Java中的本机方法声明,其中没有在项目中找到相应的JNI函数。

所有这三个功能。

当我运行项目时,我收到一个错误:

  

尝试在空对象引用上调用虚方法'java.io.FileDescriptor android_serialport_api.SerialPort.getFd()'

因为前一个问题。

我已经做了什么

  1. 添加libserial_port.so,如下面enter image description here

  2. 阅读Stackoverflow上有关此问题的所有主题,但仍无法回答。

  3. 我的build.gradle是

  4. android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'
        defaultConfig {
            applicationId "sme.sirius.oelmann.siriussme"
            minSdkVersion 21
            targetSdkVersion 25
            versionCode 1
            versionName "1.06"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            externalNativeBuild {
                cmake {
                    cppFlags "-frtti -fexceptions"
                }
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        externalNativeBuild {
            ndkBuild {
                path 'src/jni/Android.mk'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.1.1'
        compile 'com.android.support:design:25.1.1'
        compile 'com.android.support:support-v4:25.1.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.0-beta5'
        testCompile 'junit:junit:4.12'
    }

    Gradle版本2.3.0

    如果有人能帮助我,我会非常高兴。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

由于Android Studio没有看到SerialPort.c文件,我只是将代码复制并粘贴到native-lib.cpp,并将SerialPort.h添加到同一文件夹(src / main / cpp)中。 / p>

在SerialPort.java中我改变了库调用:

public class DoctorsModel
{
    [Key]
    public int d_id { get; set; }
    public string d_name { get; set; }
    public string contact { get; set; }
    public string cnic { get; set; }
    public string email { get; set; }
    public string gender { get; set; }
    //Forigen Key
    public ICollection<DocExperiencesModel> experiences { get; set; }
    public ICollection<DocSpecialization> specializations { get; set; }
    public ICollection<QualificationsModel> qualifications { get; set; }
    public ICollection<DoctorProfileModel> profiles { get; set; }
}

在build.gradle中,我已恢复默认设置:

static {
    System.loadLibrary("native-lib");
}

现在它有效!