android开发调用c++共享库so文件
1、编写libaab.cpp
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
int go() {
return 555;
}
#ifdef __cplusplus
}
#endif
运行g++命令编译得到libaab.so
arm-linux-androideabi-g++.exe -I/usr/local/linux-androideabi/platforms/android-19/arch-arm/usr/include/linux -I/usr/local/linux-androideabi/platforms/android-19/arch-arm/usr/include -c -fPIC -march=armv7-a aab.cpp -o ./aab.o
arm-linux-androideabi-ld.exe -shared ./aab.o -o ./libaab.so
或者gcc
arm-linux-androideabi-gcc.exe -I/usr/local/linux-androideabi/platforms/android-19/arch-arm/usr/include/linux -I/usr/local/linux-androideabi/platforms/android-19/arch-arm/usr/include -shared -L./ -fPIC aab.cpp -o ./libaab.so
2、新建JNITest项目,新建类JNITest/src/com/example/jo/JOB.java,专门处理jni
package com.example.jo;
public class JOB {
public static native void abc();
public static native int ShowStr(int a, int b);
static {
// load library: libaaa.so
try {
System.loadLibrary("aab");
System.loadLibrary("aaa");
} catch (UnsatisfiedLinkError ule) {
System.err.println("WARNING: Could not load library!");
}
}
}
3、打开cmd
set path=d:\soft\java\jdk1.8.0_20\bin
cd D:\Soft\adt-bundle-windows-x86_64-20140321\workspace\JNITest\bin\classes
javah -jni com.example.jo.JOB
在JNITest\bin\classes\目录下会生成头文件com_example_jo_JOB.h,复制到
/JNITest/jni/com_example_jo_JOB.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jo_JOB */
#ifndef _Included_com_example_jo_JOB
#define _Included_com_example_jo_JOB
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jo_JOB
* Method: abc
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jo_JOB_abc
(JNIEnv *, jclass);
/*
* Class: com_example_jo_JOB
* Method: ShowStr
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_jo_JOB_ShowStr
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
4、编写JNITest\jni\aaa.cpp
#include "com_example_jo_JOB.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
extern int go();
void Java_com_example_jo_JOB_abc( JNIEnv* env, jclass thiz) {
printf("hello,world!");
}
JNIEXPORT jint JNICALL Java_com_example_jo_JOB_ShowStr
(JNIEnv * env, jclass thiz, jint a, jint b) {
return go();
//return a + b;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
return result;
}
return JNI_VERSION_1_6;
}
#ifdef __cplusplus
}
#endif
5、复制刚刚生成的libaab.so到/JNITest/jni/libaab.so
6、编写/JNITest/jni/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=aab
LOCAL_SRC_FILES := libaab.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaaa
LOCAL_SRC_FILES := aaa.cpp
LOCAL_SHARED_LIBRARIES := aab
include $(BUILD_SHARED_LIBRARY)
7、在cmd运行
set path=D:\Soft\adt-bundle-windows-x86_64-20140321\android-ndk-r9d
cd /JNITest/jni
ndk-build
运行结果如下:
D:\Soft\adt-bundle-windows-x86_64-20140321\workspace\JNITest\jni>ndk-build
D:/Soft/adt-bundle-windows-x86_64-20140321/workspace/JNITest//jni/Android.mk:22:
D:/Soft/adt-bundle-windows-x86_64-20140321/workspace/JNITest//jni
[armeabi] Compile++ thumb: aaa <= aaa.cpp
[armeabi] SharedLibrary : libaaa.so
[armeabi] Install : libaaa.so => libs/armeabi/libaaa.so
[armeabi] Install : libaab.so => libs/armeabi/libaab.so
会将libaaa.so和libaab.so都复制到libs/armeabi/目录下
这样我实现了两个so,可以在libaaa.so里调用libaab.so里的方法Go,需要在aaa.cpp里声明为extern int Go();
就可以实现从一个c++的so里调用另一个so里的方法。这样就掌握了基本的c++共享库的调用方法,以后只需要将c++的开源库编译为so文件,再用这种方法就可以调用了
android开发调用c++共享库so文件的更多相关文章
- Android如何调用第三方SO库
问题描述:Android如何调用第三方SO库:已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明:已了解解决方案:1.将SO文件直接放到libs/armeabi下,然后 ...
- Android如何调用第三方SO库(转)
源:Android如何调用第三方SO库 问题描述:Android如何调用第三方SO库:已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明:已了解解决方案:1.将SO文件 ...
- go通过swig封装、调用c++共享库的技术总结
go通过swig封装.调用c++共享库的技术总结 @(知识记录) 1 简介 最近在研究golang,希望能对目前既有的python服务做一些优化,这些服务目前已经占用了6-7台机器.选择golang的 ...
- [Python] Python 调用 C 共享库
Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ...
- Android开发中常用的库总结(持续更新)
这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...
- android开发之使用SQLite数据库(db文件)
在开发中,有时须要使用db文件数据库.所以就须要将其导入项目,再将其使用程序写入到应用的db文件下使用. 代码非常easy.能够拿来直接使用. 要使用须要两个步骤: 1.创建raw文件.导入db文件. ...
- Android开发之下载Tomcat服务器的文件到模拟器的SD卡
Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...
- Android开发中多进程共享数据
# 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让ap ...
- Android开发中导入第三方库所遇问题记录
1.重复循环依赖的问题 (1)需求 如下图所示: 在Android 项目中,采用模块化开发,一个是主跑application--Mudule A,另外一个是library--Library B 1)M ...
随机推荐
- 剑指offer--面试题19
题目:求二叉树镜像 根据作者思路,自己所写代码如下: void BinaryTreeMirror(BinaryTreeNode* pRoot) { if(pRoot == NULL) return; ...
- tangent space /handness
normal tangent bitangent 三者互相垂直. 组成一个tangent space 表示一个点 对于原本位置的偏移(扰动) 考虑到这是为了 normalmap做出虚假的normal来 ...
- JavaScript高级---门面模式设计
门面模式 两个作用: 1.简化类的接口 2.消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友.它几乎是所有javascript库的核心原则 门面模式的目的是为了让开发人员用更简单 ...
- jquery加入收藏代码
<html> <head> <script type="text/javascript" src="jquery-1.9.1.js" ...
- 如何使用 Apache ab 以及 OneAPM 进行压力测试?
下一个 release 准备小长假后就要 go-live ,所有的测试 case 都 cover 过了,但还未进行过压力测试,有点不放心,刚好过节期间家人都回家去了,假期终于可以抽点时间压测一把. A ...
- orale内置函数COALESCE和GREATEST和LEAST
1. COALESCE 返回该表达式列表的第一个非空value. 格式: COALESCE(value1, value2, value3, ...) 含义: 返回value列表第一个非空的值. val ...
- Linux使用本地iso作为yum源
虚拟机中的Linux有时不能连接上外网,为了能够方便的安装各种packages,于是调查配置本地yum安装的方法. 首先,将作为源的iso的挂载到系统上. mount -o loop /dev/cdr ...
- [杂题]HDOJ5515 Game of Flying Circus
嗯...这是一道水题... 鉴于还没人写这题的题解, 那我就来写一发. 题意:有个边长为300米的正方形 嗯 这样标号 有两个人A和S,开始的时候A.S都在1(左下角)那个位置. 两个人都要按照2. ...
- 【Linux高频命令专题(7)】rm
简述 rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. 命令格式 rm [选项 ...
- 我30天在Stack Overflow问答网站上回答问题的感受
想法的萌芽 如果非要总结下我多年来是如何使用Stack Overflow的话,我的答案就是:打开网页,搜索问题,查看Stack Overflow的搜索结果,参考答案,最后再关掉网页. 我的生活已经离不 ...