Linux下安卓ndk混合编译调用so方法——QuickStart学习
转自:http://www.52pojie.cn/thread-313869-1-1.html
#注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉。因此需要仔细检查其中的语法和命名。
#Java_com_example_testforso_JniGg_ggPrintHello:Java_包名_类名_函数名
#(JNIEnv * env, jclass this)前两个参数固定。
system.loadlibrary("so名称"),与android.mk中的LOCAL_MODULE := & LOCAL_SRC_FILE := 的值对应
x1:新建立一个安卓工程
0x2:编写调用so代码和方法定义
在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so
<ignore_js_op>
在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。
<ignore_js_op>
一切正常编译,那么现在我们回到工程根目录下:
<ignore_js_op>
然后在命令行切换到此目录:
<ignore_js_op>
现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg
<ignore_js_op>
不报错,并且成功编译出.h文件,才算成功的。
上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:
0x4:编写c代码
在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了
然后就是Android.mk文件的编写了
0x5:生成so文件
切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。
0x6:android调用代码
新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:
最后代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testforso_JniGg */ #ifndef _Included_com_example_testforso_JniGg
#define _Included_com_example_testforso_JniGg
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_testforso_JniGg
* Method: ggPrintHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello
(JNIEnv *, jclass); JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
#include "com_example_testforso_JniGg.h" JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello
(JNIEnv * env, jclass this)
{
return (*env)->NewStringUTF(env, "Hello!!!");
} JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin
(JNIEnv * env, jobject this)
{
int c=; return c;
}
package com.example.testforso; public class JniGg {
static {
System.loadLibrary("gg-jni");
} static public native String ggPrintHello();
static public native int getCoin();
}
TextView tview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tview=(TextView) this.findViewById(R.id.coin); tview.setText(JniGg.ggPrintHello()+JniGg.getCoin());
}
相关附件和文档:
http://pan.baidu.com/s/1pJ2Y047
Linux下安卓ndk混合编译调用so方法——QuickStart学习的更多相关文章
- Linux下librdkafka客户端的编译运行
Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...
- .netcore在linux下使用P/invoke方式调用linux动态库
http://www.mamicode.com/info-detail-2358309.html .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 ...
- Linux下编译生成SO并进行调用执行
Linux下编译生成SO并进行调用执行 参考博客的博客: C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com) C 多个动态库存在同名函数问题处理方法:-fvi ...
- [转]Caffe在Linux下的安装,编译,实验
Caffe在Linux下的安装,编译,实验 原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...
- Linux下FFmpeg的安装编译过程【转】
本文转载自:http://www.linuxidc.com/Linux/2013-06/85628.htm 详细说下在Linux下FFmpeg的安装编译过程.参考 Ubuntu 10.04安装编译FF ...
- linux下SVN忽略文件/文件夹的方法
linux下SVN忽略文件/文件夹的方法 假设想忽略文件temp 1. cd到temp所在的目录下: 2. svn propedit svn:ignore . 注意:请别漏掉最后的点(.表示当前目录) ...
- 在Linux下访问Windows共享目录的配置方法
在Linux下访问Windows共享目录的配置方法 1.在Windows上设置一个共享目录 如:将d:\RedHat_disk设置为共享目录 2.在Windows上创建一个用户,如tommy,密码11 ...
- Linux下查看线程数的几种方法汇总
Linux下查看线程数的几种方法汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux下查看某个进程的线程数量 pstree命令以树状图显示进程间的关系(display ...
- Linux下查看磁盘挂载的几种方法
Linux下查看磁盘挂载的几种方法 第一种方法:df命令 # df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtm ...
随机推荐
- 根据流程实例ID获取当前任务
JAVA: Task task = this.processEngine.getTaskService().createTaskQuery().processInstanceId(“132501”). ...
- 【集合类型的并发】Collections.synchronizedList
摘要: 详细的解析:Collections.synchronizedList :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList ...
- libev 学习使用
libev 简单的I/O库. a high performance full featured event loop written in c libev 的大小也比 libevent 小得多并且自 ...
- 超越IEtab、网银支付助手,无需再次登陆的Firefox的IE插件
强烈推荐! fire-ie最大亮点就是:可以传递firefox下的cookie,从而避免了再次登陆或打开支付页面的繁琐. 在线安装:https://addons.mozilla.org/zh-CN/f ...
- HDU 1018 Big Number(数论,Stirling公式)
1. 利用数学公式lg(n!)=lg(2)+lg(3)+....+lg(n) 求解 2.
- CSU 1328 近似回文词【最长回文字符串(三种方法)】
输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...
- 百度MapAPI之地理编码
地理编码:将具体地址数据转换为对应坐标点经纬度功能 大致思路: 1.从数据库取得具体地理位置 2.将地址作为参数访问API接口,获取返回数据 3.处理response数据并将经度(lng.longit ...
- 13、Flask实战第13天:SQLAlchemy操作MySQL数据库
安装MySQL 在MySQL官网下载win版MySQL 双击运行 后面根据提示设置密码然后启动即可,这里我设置的密码是:123456 我们可以通过Navicat客户端工具连接上MySQL addres ...
- [Codeforces 26E] MultiThreading
Brief Intro: 给你n个数,每个数有2*CNT[i]个,让你构造一个序列 使得最终的Y值为W(其余见题面) Solution: 就是一道纯构造的题目: 先把特殊情况特殊处理,接下来考虑一般情 ...
- [BZOJ 1926] 粟粟的书架
BZOJ 传送门 Luogu 传送门 BZOJ的sillyB评测机各种无故CE,只好去Luogu上A了o(╯□╰)o Solution: 从数据范围可以发现,这其实是2道题: (1)一个$R*C$的矩 ...