找回密码
 欢迎注册
查看: 10979|回复: 2

[原创] GMP如何在android apk应用上调用?

[复制链接]
发表于 2014-7-10 13:08:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
咱们论坛关于GMP的讨论和交流非常之多,其广度和深度在国内绝对是空前的。

我再加一帖,以增益其广度,教大家如何在android的apk应用里用上GMP。

1 前言。
在开始之前,我先解释一下几个问题。
1.1 GMP是C/C++库,android 的apk应用是java写的,这个跨语言的隔阂怎么解决?
java跑在虚拟机上,而虚拟机是原生的系统应用,java针对虚拟机提供有接口调用(JNI),可以让我们在java层与虚拟机之间互相通信,我们可以走这条路线。

1.2 android系统一般都是跑在ARM架构上,GMP莫非要编译成ARM版本的?     
  没错。通常都是在PC上编译成ARM平台的二进制,需要用到交叉编译工具链。这个你可以自己随便找一些第三方的toolchain,不过,我推荐大家使用 android NDK里的工具链。

2 一睹为快:
参考帖子:http://bbs.emath.ac.cn/thread-4855-2-1.html

gmp.jpg

3 环境准备
3.1 下载android的SDK,NDK
3.2 手机要能成功被adb连接
3.3 JDK, ant
3.4 swig 自动化接口生成和封装。 (当然,不用swig,你也可以用JDK自带的javah工具生成头文件,然后去写对应的C/C++实现。但这过程比较麻烦,很考验人。)

4 具体过程

评分

参与人数 1威望 +2 金币 +2 贡献 +2 经验 +2 鲜花 +2 收起 理由
G-Spider + 2 + 2 + 2 + 2 + 2 很给力!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-7-11 08:31:59 | 显示全部楼层
GMP的ARM版本,你可以自己从源码编译,参考本论坛帖子:
http://bbs.emath.ac.cn/thread-5214-1-1.html

也可以拿别人编译好的二进制:
https://github.com/Rupan/gmp
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-8-24 09:06:21 | 显示全部楼层
改了下代码,做成用户交互版本的,截图效果已经在顶楼更新。

其中的求nextPrime 代码如下, 完整 的android工程代码可以在论坛QQ群下载。
(堆上的数据还没统一管理,如果用户频繁操作的话会是一个潜在的问题)

  1. char* nextPrime (const char *b)
  2. {   
  3.    mpz_t next,c;

  4.    mpz_inits(next,c,'\0');
  5.    int status = mpz_set_str (c, b, 10);
  6.    if(status!=0)
  7.    {
  8.         mpz_set_str(next,"1",10);
  9.    }
  10.     mpz_nextprime(next,c);
  11.    
  12.    size_t len = mpz_sizeinbase(next,10)+2;
  13.    char *buffer=(char*) malloc(len*sizeof(char));
  14.    mpz_get_str(buffer,10,next) ;
  15.    
  16.    mpz_clears(next,c,'\0');
  17.    return buffer;   

  18. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-27 05:36 , Processed in 0.033427 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表