android 引入 .so,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
/* 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后面的对勾去掉如下图
再运行,一切正常,得到了我想要的值
android 引入 .so,android studio导入so文件,并调用其中的方法相关推荐
- Endnote 导入enw文件无响应及解决方法
Endnote 导入enw文件无响应及解决方法 参考文章: (1)Endnote 导入enw文件无响应及解决方法 (2)https://www.cnblogs.com/shuaihe/p/114701 ...
- mysql转储导入错误_数据库MYSQL导入SQL文件时错误的解决方法(2种)
从服务器数据库用navicate导出的.sql文件后再用navicate导入到本地的数据库中会出现若干条记录的错误: [Err] 1064 – You have an error in your SQ ...
- JavaScript文件中调用AngularJS内部方法或改变$scope变量
需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...
- Android Studio导入so文件到项目中
1.采用最简单直接的方式导入s0文件:在app下新建jniLibs/armeabi目录,并将指定so文件拷贝到这一目录. 2.一般来说其他第三方的开放平台的so文件都是已经把对应的本地Java接口类一 ...
- Android系统签名生成Studio导入系统keystore
一.Android签名文件简述 为什么要签名? 任何一个安装包都需要有签名.为App签名的本质是说明这个App是我开发的,不是别人.通过签名可以在应用和开发者之间建立可信任的关联. 通过签名,Andr ...
- 80m的mysql文件要导入多久_mysql导入数据库文件最大限制更改解决方法:You probably tried to upload too large file...
最近一次在用phpmyadmin导入mysql数据库时,偶的15M的数据库不能导入,mysql数据库最大只能导入2M.. phpmyadmin数据库导入出错: You probably tried t ...
- matlab 导入元胞,MATLAB导入xls文件以及cell的使用方法
使用matlab读入.xls的文件时候可以用[T,TXT,RAW]=xlsread("filename.xls")导入也可以使用import data 的办法手动导入文件.但是我比 ...
- Google drive谷歌网盘下载副本文件无法调用IDM解决方法
最近通过加入星标并复制产生副本文件来解决谷歌限制文件大小时,遇到了Google drive谷歌网盘下载副本文件无法调用IDM来进行下载,只能够使用浏览器直接下载. 但是直接下载原文件没有出现问题,可以 ...
- android studio导入arr文件
把arr文件导入android studio 其实只需要简单的几步,本文以NativeImgCompress.arr为例: 1.把.arr文件复制到libs目录下 2.在app的build.gradl ...
最新文章
- JPA 注解的CascadeType属性
- Ehcache 缓存监控配置
- eclipse的下载JDK的安装与配置
- 丢失api-ms-win-crt-runtime-l1-1-0.dll问题解决
- debian及ubuntu挂载本地硬盘的ISO镜像文件
- 20220213-CTF MISC-a_good_idea(stegsolve工具的使用)-2017_Dating_in_Singapore
- 《html5 从入门到精通》读书笔记(一)
- virsh 基于xml create VMs虚机
- Sun HotSpot JVM内存管理及垃圾收集
- softmax的简洁实现
- 数据挖掘面试题之梯度提升树
- 《工作型PPT设计之道》培训心得
- abaqus结果名称
- GB50311-2007综合布线工程设计规范
- 16. Spring boot 错误页面
- UVa 12304 2D Geometry 110 in 1!(圆的处理)
- python常用的几个库_盘点Python常用的20个库
- Java 应用程序,该程序中有 3 个类:Triangle、T rapezium 和 Circle,分别用来 表示三角形、梯形和圆形。
- Bootstrap学习笔记——缩略图、警示框、进度条、媒体对象、列表组、画板
- 2018.11.3 PION模拟赛
热门文章
- 为什么 Facebook 的 Libra 会招来科技监管的雷霆之锤?
- 权威解读 GitHub、Apache 疑云:主流开源软件究竟是否会被闭源?| CSDN 独家
- 独家!币安被盗原因找到了!7074 枚比特币竟是这样丢掉的
- 2018 OpenInfra Days China 大咖来袭——开源,我们是认真的
- 马化腾回应《腾讯没有梦想》:我的理想不是赚多少钱
- 动我 Java?是时候让甲骨文退休了!
- elk-可视化图标(nginx)
- zabbix监控nginx连接数
- python如何让进程运行在指定的cpu上_java程序可以实现在指定CPU上运行吗?
- python计算并返回任意多个整数的和_利用Python的多重处理方法计算一个长输入lin的整数和...