android studio导入so文件,并调用其中的方法

       在单位的项目中,需要一个算法来计算一个特殊值,可是相关的部门却不给计算公式,只是给了几个封装好的so文件和一个.h文件,让传入几个值,然后得到相应的值。拷。。。。。没法子,人家不给,我们只好调用这个了。

       这里在导入so文件和调用其中的方法时,遇到很多坑,这里做一个记录,以备以后查询。

       我使用的as1.5版本,一直没有升级呢。所以这里的所有方法,都是针对这个版本来的。

       第一步,我们将相关的so文件,复制到libs文件里。

                       这里,相关部门给出了所有应该有的文件夹的.so文件,如下图

                      

                       这里要注意一点,如果你加完之后,找不到.so文件,你看一下你有没有armeabi-v7a文件夹,在此文件夹里,一定要有so文件,不然在有些版本中就会出现错误。

       第二步,修改,我们app下面的build.gradle文件,添加如下代码

                      

   task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
        destinationDir file("$projectDir/libs")
        baseName "Native_Libs2"
        extension "jar"
        from fileTree(dir: "libs", include: "**/*.so")
        into "lib"
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
                    这段代码,是与buildTypes同级的,如下图

                   

           第三步,建立相应的包与类文件

                          这里我们要根据给的.h文件来建立相应的包,文件名是这个com_romaway_stocklib_StockIndex.h那么,我们就要建立一个com.romaway.stocklib包,然后在此包中,建立StockIndex.class文件。建好后,如下图

                         

                         
          第四步,根据给出的.h文件,我们根据里面的方法,编写相应的方法,我的文件里,是这样的,只有一个方法,带了10多个数组。

                         下面是我的.h文件,我们

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_romaway_stocklib_StockIndex */

#ifndef _Included_com_romaway_stocklib_StockIndex
#define _Included_com_romaway_stocklib_StockIndex
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_romaway_stocklib_StockIndex
 * Method:    CalcZiWuLine
 * Signature: ([D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D)I
 *这里注意,看到_CalcZiWuLine了吗,这个就是你要编写的方法名了
 */
 JNIEXPORT jint JNICALL Java_com_romaway_stocklib_StockIndex_CalcZiWuLine
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray);

#ifdef __cplusplus
}
#endif
#endif
                    StockIndex.class文件如下

                

public class StockIndex {


    public static native void CalcZiWuLine(double[] list_open,double[] list_close,double[] list_high,double[] list_low,

                                           double[] list1,double[] list2,double[] list3,double[] list4,double[] list5,
                                           double[] list6,double[] list7,double[] list8,double[] list9,double[] list10,
                                           double[] list11,double[] list12,double[] list13);
}

           OK,当你写完之后,你会发现这页有提示有错,这里呢,我们先不去管它,一会做统一处理。

          第五步,在你想要的地方进行调用这个方法

        

package com.example.cg.sofileopera;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.romaway.stocklib.StockIndex;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    static
    {
        System.loadLibrary("StockIndex");  //引入包名
    }


    private Button btn_view;
    private TextView txt_1;
    private TextView txt_2;
    private TextView txt_3;
    private TextView txt_4;
    private TextView txt_5;
    private TextView txt_6;
    private TextView txt_7;
    private TextView txt_8;
    private TextView txt_9;
    private TextView txt_10;
    private TextView txt_11;
    private TextView txt_12;
    private TextView txt_13;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initControls();
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        btn_view = (Button)findViewById(R.id.btn_view);
        btn_view.setOnClickListener(this);

        txt_1 = (TextView)findViewById(R.id.txt_1);
        txt_2 = (TextView)findViewById(R.id.txt_2);
        txt_3 = (TextView)findViewById(R.id.txt_3);
        txt_4 = (TextView)findViewById(R.id.txt_4);
        txt_5 = (TextView)findViewById(R.id.txt_5);
        txt_6 = (TextView)findViewById(R.id.txt_6);
        txt_7 = (TextView)findViewById(R.id.txt_7);
        txt_8 = (TextView)findViewById(R.id.txt_8);
        txt_9 = (TextView)findViewById(R.id.txt_9);
        txt_10 = (TextView)findViewById(R.id.txt_10);
        txt_11 = (TextView)findViewById(R.id.txt_11);
        txt_12 = (TextView)findViewById(R.id.txt_12);
        txt_13 = (TextView)findViewById(R.id.txt_13);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId())
        {
            case R.id.btn_view:
                tempData();
                break;
        }
    }


    private void tempData() {

        double[] arrOpen = new double[5];
        double[] arrClose = new double[5];
        double[] arrHigh = new double[5];
        double[] arrLow = new double[5];



        double[] arr1 = new double[5];
        double[] arr2 = new double[5];
        double[] arr3 = new double[5];
        double[] arr4 = new double[5];
        double[] arr5 = new double[5];
        double[] arr6 = new double[5];
        double[] arr7 = new double[5];
        double[] arr8 = new double[5];
        double[] arr9 = new double[5];
        double[] arr10 = new double[5];
        double[] arr11 = new double[5];
        double[] arr12 = new double[5];
        double[] arr13 = new double[5];

        arrOpen[0] = 19.69;
        arrOpen[1] = 25.99;
        arrOpen[2] = 28.59;
        arrOpen[3] = 28.59;
        arrOpen[4] = 34.6;

        arrClose[0] = 23.63;
        arrClose[1] = 25.99;
        arrClose[2] = 28.59;
        arrClose[3] = 31.45;
        arrClose[4] = 34.6;

        arrHigh[0] = 23.63;
        arrHigh[1] = 25.99;
        arrHigh[2] = 28.59;
        arrHigh[3] = 31.45;
        arrHigh[4] = 34.6;

        arrLow[0] = 19.69;
        arrLow[1] = 25.99;
        arrLow[2] = 28.59;
        arrLow[3] = 31.45;
        arrLow[4] = 34.6;

        new StockIndex().CalcZiWuLine(arrOpen, arrClose, arrHigh, arrLow, arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8, arr9, arr10,
                arr11, arr12, arr13);

        String str1= "";
        String str2= "";
        String str3= "";
        String str4= "";
        String str5= "";
        String str6= "";
        String str7= "";
        String str8= "";
        String str9= "";
        String str10= "";
        String str11= "";
        String str12= "";
        String str13= "";

        for(int i=0;i<5;i++)
        {
            str1 += arr1[i] + ",";
            str2 += arr2[i] + ",";
            str3 += arr3[i] + ",";
            str4 += arr4[i] + ",";
            str5 += arr5[i] + ",";
            str6 += arr6[i] + ",";
            str7 += arr7[i] + ",";
            str8 += arr8[i] + ",";
            str9 += arr9[i] + ",";
            str10 += arr10[i] + ",";
            str11 += arr11[i] + ",";
            str12 += arr12[i] + ",";
            str13 += arr13[i] + ",";
        }

        txt_1.setText(str1);
        txt_2.setText(str2);
        txt_3.setText(str3);
        txt_4.setText(str4);
        txt_5.setText(str5);
        txt_6.setText(str6);
        txt_7.setText(str7);
        txt_8.setText(str8);
        txt_9.setText(str9);
        txt_10.setText(str10);
        txt_11.setText(str11);
        txt_12.setText(str12);
        txt_13.setText(str13);
    }
}

        代码完成,现在编译,运行,报错。没事,这里只要设置一下。File--->Settings--->Plugins,将 Android NDK Support后面的对勾去掉如下图

      

     
     再运行,一切正常,得到了我想要的值

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
serialPortOp是一个串口通信的工具库,可以在Android Studio中使用。其详细用法如下: 1. 导入文件 将serialport.jar和serialport.so两个文件添加到Android Studio工程中的libs目录中。 2. 添加权限 在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.SET_DEBUG_APP"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.intent.action.MASTER_CLEAR"/> <uses-permission android:name="android.permission.BROADCAST_STICKY"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.USE_SIP"/> ``` 3. 打开串口 1) 创建SerialPort对象,需要传入串口地址和波特率参数。 2) 获取SerialPort对象的InputStream和OutputStream流。 3) 使用InputStream和OutputStream进行数据的读取和写入。 示例代码: ``` try { mSerialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0); mInputStream = mSerialPort.getInputStream(); mOutputStream = mSerialPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } ``` 4. 关闭串口 在结束程序或者不再使用串口时,需要关闭串口。可以调用SerialPort的close()方法来关闭串口。 示例代码: ``` if (mSerialPort != null) { mSerialPort.close(); mSerialPort = null; } ``` 以上就是serialPortOp的详细用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值