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 ...
随机推荐
- 1502: [NOI2005]月下柠檬树 - BZOJ
Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的 ...
- Pycharm
1.下载pycharm-community-3.0.2.exe 2.setting: keymap scheme:快捷键方案,可选择自带的:default:或者选择eclipse的快捷方案. ide ...
- [LeetCode]Link List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- javascript中创建插入元素
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Meteor 简介
简介 先来活动一下大脑.假设你坐在电脑面前,在两个窗口中打开同一个文件夹. 在其中一个窗口中删除一个文件,另一个窗口中的这个文件会消失吗? 不用实际操作你也知道肯定会消失的.在本地文件系统中的操作,不 ...
- lintcode :最大子数组
题目: 最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 ...
- Hibernate逍遥游记-第3章对象-关系映射基础-access="field"、dynamic-insert、dynamic-update、formula、update=false
1. package mypack; import java.util.*; public class Monkey{ private Long id; private String firstnam ...
- 手动安装UniDAC的过程
每次安装都不一样,而且有时候挺麻烦的,所以记下来.我这次安装过程是这样的: 0. 修改Source\Delphi7\Make.bat,填入正确的IdeDir 1.找到source\delphi7目录, ...
- *windows下安装以及配置nginx
1.从nginx官网下载相应的安装包. http://nginx.org/
- IOS打包脚本
1.xcodebuild clean -project $projectname.xcodeproj -configuration Release -alltargets2.xcodebuild ar ...