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 ...
随机推荐
- Activiti 6.0 入门篇
从Activiti网站下载Activiti UI WAR文件(或百度云) 将下载的activiti-app.war复制到Tomcat的webapps目录. 启动Tomcat 打开浏览器并转到 http ...
- springboot 返回json格式数据的时间格式配置
#时间戳统一转换 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 NOTE:time-zon ...
- hdu 1411(四面体的体积)
校庆神秘建筑 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- MYECLIPSE中快速解决项目的错误的方法
Use the IDE's help as follows:- Right mouse click on the error in the 'Problems' view- Select the 'Q ...
- LayerDate渲染多个class出现闪现问题的解决
填写表单的时候有时候会需要添加一行表单的业务逻辑,而表单要用到LayerDate的话便不可避免的出现多个class的情况 这种情况下后面的class是无法渲染的,layerDate官网提出了解决方法: ...
- AVR单片机中的EEPROM
1.EEPROM介绍 Electrically Erasable Programmable Read Only Memory 电气可拭除可编程只读存储器 发展过程:ROM – > PROM –& ...
- JS动态计算移动端rem的解决方案
首先介绍下rem 说起rem就的说px,em: PX为单位 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的 ...
- 转:mysql group by 用法解析(详细)
group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表. SELECT子句中的列名必须为分组列或列函数.列函数对于GROUP BY子 ...
- 洛谷 P3041 [USACO12JAN] Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- ORMLite整合SQLCipher
Android数据库加密,目前就是SQLCipher对SQLite整体加密,微信也是使用这种方式.开源,且支持很多平台. SQLCipher虽说开源了,但是编译好的jar和so文件,还是要收费的. 但 ...