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文件,再用这种方法就可以调用了

时间: 2024-09-30 15:42:22

android开发调用c++共享库so文件的相关文章

Android如何调用第三方SO库

出处:http://zwz94.blog.163.com/blog/static/3206039520131111101412959/ 问题描述:Android如何调用第三方SO库:已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明:已了解解决方案:1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx"):再public native static int  xxx_xxx_xxx():接下来就可以直

[Python] Python 调用 C 共享库

Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ctypes 模块调用 C 共享库 ctypes 是 Python 标准库提供的一个模块,Python 2.3 版本以上支持该模块.ctypes 是 Python 高级外部函数接口,Python 通过它可以调用 C 语言编译的静态链接库和动态链接库.ctypes 支持多个平台,包括 Windows,

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

Android开发之常用开源库直接拿来用

1.from  代码家 整理比较好的源码连接 *************************************************************************************************************************************************************************** http://blog.zhan-dui.com/?page_id=60 感谢 "代码家"整理 一.

android开发调用自定义的webservice

在上一篇,我们开发了自定义的service:使用MyEclipse开发webservice,今天我们用android程序调用自定义的webservice接口: 在浏览器输入http://192.168.0.5:8080/TestService/MyServicePort?wsdl 其中MyServicePort是webservice服务器端的sun-jaxws.xml文件中的url-pattern="/MyServicePort" 注意这里的192.168.0.5是我本机的ip地址,需

Linux 共享库so文件

so文件与windows下的dll文件类似. 即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同的进程加载到不同的内存空间. so文件编译方法: -so文件的源文件中不需要有main函数,即使有也不会被执行. -编译的时候gcc需要加 -fPIC选项,可以使gcc产生与位置无关的代码.   $(CC) -shared -o $(EXEC) $(OBJS) -链接时gcc使用 -shared选项,指示生成一个共享库文件.    $(CC) -Wall -g

Linux共享库.so文件的命名和动态链接

Linux中的.so文件 是动态链接的产物 共享库理解为提供各种功能函数的集合,对外提供标准的接口 Linux中命名系统中共享库的规则 主版本号:不同的版本号之间不兼容 次版本号:增量升级 向后兼容 发行版本号:对应次版本的错误修正和性能提升,不影响兼容性 Linux中的共享库并不都是这样的格式 比如GLibc的共享库命名为:libc-x.y.z.so 动态链接器也是GLibc的一部分,使用ld-x.y.z.so命名 libm(数学库)等 SO-NAME机制 系统和程序中要链接的共享库的格式一般

使用ctypes调用C共享库中函数返回值为链表式结构时的方法

/*********************************************************************  * Author  : Samson  * Date    : 02/02/2015  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

android开发之使用SQLite数据库(db文件)

在开发中,有时需要使用db文件数据库,所以就需要将其导入项目,再将其使用程序写入到应用的db文件下使用. 代码很简单,可以拿来直接使用. 要使用需要两个步骤: 1.创建raw文件,导入db文件,如下: 2.代码 public class DBOpenHelper { private final int BUFFER_SIZE = 400000; public static final String DB_NAME = "idiom.db"; // 保存的数据库文件名 public st