/相 发表于 2024-4-13 02:23:38

GMP如何在android apk应用上调用?

咱们论坛关于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

https://bbs.emath.ac.cn/data/attachment/forum/201408/24/090324p14w034d3k4vwq8k.jpg

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

4 具体过程

oasuoxi 发表于 2024-4-13 02:24:34

GMP的ARM版本,你可以自己从源码编译,参考本论坛帖子:
http://bbs.emath.ac.cn/thread-5214-1-1.html

也可以拿别人编译好的二进制:
https://github.com/Rupan/gmp

hozewovaxemam 发表于 2024-4-13 02:25:33

改了下代码,做成用户交互版本的,截图效果已经在顶楼更新。

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

char* nextPrime (const char *b) {       mpz_t next,c;   mpz_inits(next,c,'\0');   int status = mpz_set_str (c, b, 10);   if(status!=0)   {      mpz_set_str(next,"1",10);   }    mpz_nextprime(next,c);      size_t len = mpz_sizeinbase(next,10)+2;   char *buffer=(char*) malloc(len*sizeof(char));   mpz_get_str(buffer,10,next) ;      mpz_clears(next,c,'\0');   return buffer;    }
页: [1]
查看完整版本: GMP如何在android apk应用上调用?