android NDK学习篇2之two-libs——使用(单个)静态库生成动态库
来源:互联网 发布:tt手机语音软件 编辑:程序博客网 时间:2024/05/20 23:34
下面以NDK提供的two-libs为例子,走一遍如何在jni层调用其他C文件的函数,原例子在second.c这个jni层文件中调用first.c里面的C函数。
通过Androi.mk文件编译生成一个动态库文件。
1、建立android工程,编写java对应JNI层的本地接口:
package com.example.twolibs;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class TwoLibs extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); int x = 1000; int y = 42; // here, we dynamically load the library at runtime // before calling the native method. // int z = add(x, y); tv.setText( "The sum of " + x + " and " + y + " is " + z ); setContentView(tv); } public native int add(int x, int y); static { System.loadLibrary("twolib-second"); }}
2、编写jni层中间层代码second.c,在其中调用first.c中的first(int x,int y)函数代码:
先看jni层second.c的代码:
#include "first.h"#include <jni.h>jintJava_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y ){ return first(x, y);}first.c中c代码:
#include "first.h"int first(int x, int y){ return x + y;}
其中first.h中就申明此方法,具体如下:
#ifndef FIRST_H#define FIRST_Hextern int first(int x, int y);#endif /* FIRST_H */
3、编写Android.mk文件:在此要注意先用first.c生成静态库模块libtwolib-first.a,然后再用其来生成最终的动态库。由此可知,若我们已经编译生成了libtwolib-first.a这个静态库,那么直接用引用它就可以生成最终的libtwolib-second.so 动态库。
LOCAL_PATH:= $(call my-dir)# first lib, which will be built statically#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-firstLOCAL_SRC_FILES := first.cinclude $(BUILD_STATIC_LIBRARY)# second lib, which will depend on and include the first one#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-secondLOCAL_SRC_FILES := second.cLOCAL_STATIC_LIBRARIES := libtwolib-firstinclude $(BUILD_SHARED_LIBRARY)
4、用NDK来编译生成动态库.so文件,其中静态库可在/obj/local/armeabi目录下找到它。
至此,整个流程完毕,但接下来的才是我想记录的重点内容,我想直接使用libtwolib-first.a,和first.h和与java接口相接的two.c文件来直接生成libtwolib-second.so这个文件。
于是可以扩展到两类问题:
第一:使用静态库来生成动态库。如(libtwolib-first.a 来生成libtwolib-two.so)
第二:使用动态库来生成动态库。如(libtwolib-first.so 来生成libtwolib-two.so)
其中静态库.a文件来生成动态库又可分为单个.a文件和多个.a文件生成.so文件。
第一:即NDK中使用单个静态库来生成动态库问题,前提是这个静态库(动态库)是用NDK编译器编译生成的。
整理需要的文件,将刚生成.a文件拷贝的jni目录下,同时生成first.c文件,用到的文件如下:
thinker@fans:~/android/android-ndk-r9/samples/two-libs/jni$ lsAndroid.mk first.h libtwolib-first.a second.c
删除刚生成的libs和obj目录,修改Android.mk文件如下:
LOCAL_PATH:= $(call my-dir)# first lib, which will be built statically#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-firstLOCAL_SRC_FILES := libtwolib-first.ainclude $(PREBUILT_STATIC_LIBRARY)# second lib, which will depend on and include the first one#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-secondLOCAL_SRC_FILES := second.cLOCAL_STATIC_LIBRARIES := libtwolib-firstinclude $(BUILD_SHARED_LIBRARY)
再NDK来编译生成动态库.so文件,如此就OK了。
另一种mk文件的写法也行,而且更加简便:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-secondLOCAL_SRC_FILES := second.cLOCAL_LDFLAGS := libtwolib-first.ainclude $(BUILD_SHARED_LIBRARY)
参考资料:
http://blog.csdn.net/wjr2012/article/details/6887559
- android NDK学习篇2之two-libs——使用(单个)静态库生成动态库
- android NDK学习篇4之two-libs——使用(单个动态库)来生成动态库
- android NDK学习篇3之two-libs——使用(多个)静态库生成动态库
- android NDK 使用(多个)静态库生成动态库
- NDK Samples之two-libs
- NDK之对例子two-libs的学习
- Android NDK生成及连接静态库与动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- 调研目前主要的开源网络爬虫,并且说明各自的特点、局限性以及相互之间的区别
- jetty之WebAppContext
- HDU 4091Zombie’s Treasure Chest(贪心+枚举)
- FMM和BMM分词题目
- iOS开发之定时滑动图片(UIPageControl,UIScrollView)
- android NDK学习篇2之two-libs——使用(单个)静态库生成动态库
- 倒排索引和term-document关联矩阵
- Add a Node to Oracle 12cR1 RAC on RHEL 6
- jdbc连接数据库
- NSData
- 中断一 中断向量表跳来跳去跳到C
- 修改Android EditText光标,限制EditText的输入字数
- C#初始化数组
- Rocchio 1971算法进行相关性反馈题目