您的位置:首页 > 移动开发 > Android开发

[置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

2013-07-24 20:51 691 查看
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();




2:下载demo[猛戳这里下载demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐