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
3 环境准备
3.1 下载android的SDK,NDK
3.2 手机要能成功被adb连接
3.3 JDK, ant
3.4 swig 自动化接口生成和封装。 (当然,不用swig,你也可以用JDK自带的javah工具生成头文件,然后去写对应的C/C++实现。但这过程比较麻烦,很考验人。)
4 具体过程 GMP的ARM版本,你可以自己从源码编译,参考本论坛帖子:
http://bbs.emath.ac.cn/thread-5214-1-1.html
也可以拿别人编译好的二进制:
https://github.com/Rupan/gmp 改了下代码,做成用户交互版本的,截图效果已经在顶楼更新。
其中的求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]