wayne 发表于 2014-7-10 13:08:11

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 具体过程

wayne 发表于 2014-7-11 08:31:59

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

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

wayne 发表于 2014-8-24 09:06:21

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

其中的求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应用上调用?