[置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
0:前言:
- 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于:
- 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直接调用
- 如果丙方android公司哪一天老板脑瓜抽筋说:“擦,咱们利用乙方C++公司给的库基础上再包装一下,再添加我们公司业务的新功能,打包成库,我们也卖!!!!”这种情况下不能直接调用乙方给的库了
- 有的库只是实现了基本的业务逻辑,更加复杂的需要调用库中的函数来实现
- 在本篇中,我们整合第三方库到我们自己的库中,详情请看下面
[第一篇:android利用jni调用第三方库——编写库libhello.so]
[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]
[第三篇:android利用jni调用第三方库——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so]
1:搞起:
- 同样也是从新建helloword的android程序开始,和第一篇中步骤一样,这里不再多说了,主要是内容不一样,我会贴出代码和解释
- 在jni文件夹中新建文件夹hello,在hello中新建include,hello放libhello.so,include中放头文件com_hello_hello_HelloActivity.h
- 结构如图
- src目录下有两个包,分别是
com.hello.hello
com.hello.word - com.hello.hello包中HelloActiviry.java中的代码
package com.hello.hello;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle; public class HelloActivity {
// static
// {
// System.loadLibrary("hello");
// }
public static native String sayHello(); // 第三方库函数 } - com.hello.word包中HellowordActiviry.java中的代码,这个Activity是我们的android主程序
package com.hello.word; import com.hello.hello.HelloActivity; import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle; public class HellowordActivity extends Activity {
static{
System.loadLibrary("hello"); //注意这里要引入两个包
System.loadLibrary("helloword");
}
public static native String sayHelloWord(); // 本地库函数
public static native String sayHello(); // 本地库函数
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();//这个是测试android直接调用库函数
// new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();//这个是测试android调用我们自己的包
// new AlertDialog.Builder( this ).setMessage( sayHello()).show();//这个是测试android调用我们自己的包整合第三方包后的调用函数
}
} - 同样经过javah命令(不明白的地方请去看第一篇)生成头文件
- 自己的头文件com_hello_word_HellowordActivity.h代码,明显是自己的两个接口,
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hello_word_HellowordActivity */ #ifndef _Included_com_hello_word_HellowordActivity
#define _Included_com_hello_word_HellowordActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hello_word_HellowordActivity
* Method: sayHelloWord
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHelloWord
(JNIEnv *, jclass); /*
* Class: com_hello_word_HellowordActivity
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHello
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif - helloword.cpp代码,这个文件主要用来实现上述头文件中的接口函数,
#include <string.h>
#include <jni.h>
#include "com_hello_word_HellowordActivity.h"
#include "com_hello_hello_HelloActivity.h"//注意要引入第三方库的头文件
/*
* Class: com_hello_word_HellowordActivity
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHelloWord
(JNIEnv *env, jclass) {
//dosomething else
return env->NewStringUTF("helloword");
} /*
* Class: com_hello_word_HellowordActivity
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHello
(JNIEnv *env, jclass thiz){
//dosomething else
return Java_com_hello_hello_HelloActivity_sayHello(env,thiz);//在我们自己的库函数中调用第三方库函数
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return result;
}
return JNI_VERSION_1_4;
} - 注意引入头文件
- 在我们自己的库函数中调用第三方库,可扩展性增大
- Adnroid.mk代码,这个代码需要注意
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello/libhello.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/hello/include
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := helloword
LOCAL_SRC_FILES := helloword.cpp
LOCAL_SHARED_LIBRARIES := libhello
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY) - 运行测试android程序直接调用第三方库方式
new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();
- 运行测试android直接调用自己库方式
new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();
- 运行测试android直接调用自己库方式,但是我们的库调用了第三方库,在我们的库中对第三方库进行了包装,实现了我们自己的逻辑
new AlertDialog.Builder( this ).setMessage( sayHello()).show();
- 运行测试android程序直接调用第三方库方式
2:下载demo[猛戳这里下载demo]
[置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so的更多相关文章
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...
- [转][android][利用JNI技术在Android中调用、调试C++代码]
在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...
- Android的JNI调用(一)
Android提供NDK开发包来提供Android平台的C++开发,用来扩展Android SDK的功能.主要包括Android NDK构建系统和JNI实现与原生代码通信两部分. 一.Android ...
- Android的JNI调用(二)
Android Studio 2.3在native下已经有了代码提示功能,按照提示下载相应组件就可以debug native代码. 一.Java调用JNI与JNI调用Java 1.1 C调用Java ...
- Android通过JNI调用驱动程序(完全解析实例)
要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是 ...
- 【转】Android通过JNI调用驱动程序(完全解析实例)
原文网址:http://blog.csdn.net/ok138ok/article/details/6560875 要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口 ...
- (AIDE)Android Eclipse JNI 调用 .so文件加载问题
背景:对于Android工程 Eclipse里编译好的.so文件放到 libs\armeabi下以后, 这样.so文件就可以打包到apk文件里,在apk装到手机上以后 在libs\armeabi下的. ...
- Android于JNI调用列出的程序
1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...
- Java利用JNI调用C/C++写成的DLL
前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...
随机推荐
- web前端开发工程师
web前端开发工程师 百科名片 Web前端开发工程师是一个很新的职业,在国内乃至国际上真正开始受到重视的时间不超过5年.Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进 ...
- firebug加载不了js脚本文件问题
转载自:http://tieba.baidu.com/p/1008322286 现象: 页面中有加载js文件,但是firebug却提示: 本页面不包含 Javascript 如果 <scr ...
- NoSql 精粹导读图
- Z.Studio高级成衣定制(双井店)价格,地址(图)-北京-大众点评网
Z.Studio高级成衣定制(双井店)价格,地址(图)-北京-大众点评网 Z.Studio高级成衣定制(双井店)
- flex——将Sprite控件添加到FLEX UI中
在Flex的帮助文档里,有很多例子都是扩展Sprite类的.如果想把这些实例添加到你的s:Application中,如:addChild(DisplayObject ),肯定会出错.错误的大致意思是: ...
- .NET委托:一个关于C#的睡前故事 【转】
紧耦合 从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺.但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒.但是彼得又不想让老板呆 ...
- 优先队列(priorityqueue)
队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...
- Oracle日志文件常用操作
Oracle关于日志文件基本操作1.查询系统使用的是哪一组日志文件:select * from v$log; 2.查询正在使用的组所对应的日志文件:select * from v$logfile; 3 ...
- 【拆点费用流】【HDU1853】【 Cyclic Tour】
题意: 有N个城市,M条单向路,Tom想环游全部城市,每次至少环游2个城市,每个城市只能被环游一次.由于每条单向路都有长度,要求游遍全部城市的最小长度. // 给定一个有向图,必须用若干个环来覆盖整个 ...
- ubuntu高版本环境变量问题
在ubuntu较高的版本(博主使用的是14.10)下,可以在/etc/environment中配置环境变量,这个环境变量可能会覆盖用户~/.bashrc中配置的环境变量,这个应该引起注意.