http://www.eoeandroid.com/thread-55467-1-1.html

首先需要确定的是你的.so是否是android支持的,不是所有的.so都可以的,本身就分为linux-X86和linux-arm两个大类。查看so是不是编译成ARM模式下的so

$ file libtest.so

libtest.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped如果这样就是支持的。PS ndk-build生成的.so肯定是支持的。

http://kaneiqi.iteye.com/blog/666816

http://blog.csdn.net/victoryckl/article/details/6832333

http://blog.csdn.net/vrix/archive/2010/03/06/5351196.aspx
已有一个so文件,名为"libold.so"。其中有方法"int oldmethod()"。
现在由于某些原因,接口变化,或根本不知道old.so中接口,但要用到oldmethod方法,因此,用一个新的接口,若接口为"jint Java_com_example_newmethod( JNIEnv*,jobject)"
生成新的so文件,来使用。

mynewlib.c文件如下:
#include <string.h>
#include <jni.h>
#include <dlfcn.h>
jint

Java_com_example_tnewmethod(( JNIEnv* env, jobject thiz )

{
void* filehandle = dlopen("/data/data/com.example/lib/libold.so", RTLD_LAZY ); // 打开原so文件
if(filehandle)
{
int( * oldmethod) ();
oldmethod= dlsym(filehandle, "oldmethod"); //引入原so中的函数
if( oldmethod)
{
//调用该函数
}
}
}
这里的dlopen和dlsym是android中/system/lib下libdl.so中的函数。因此需要把这个文件从android中导出,在模拟器中直接pull就可以了。之后在编译so时没有link到这个so,编译会失败。有了该文件后,Android.mk如下:

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := my-new-lib
LOCAL_SRC_FILES := mynewlib.c
# 这里link了libdl.so,好像放在ANDROID_NDK_ROOT路径下,不对的话,看编译出错的信息也能够找到正确的路径吧
LOCAL_LDLIBS := -L . -ldl

include $(BUILD_SHARED_LIBRARY)

更多相关文章

  1. 【Android(安卓)安装包优化】资源混淆 ( AAPT2 资源编译工具 | r
  2. Android(安卓)NDK 开发教程三:Hello JNI 示例
  3. Android(安卓)基础知识介绍
  4. Android的MediaRecorder架构介绍
  5. Android软件测试的日志文件抓取简介
  6. Android(安卓)源代码编译前后的目录结构
  7. Windows下用Git下载android源码
  8. Android(安卓)build system note
  9. NPM 和webpack 的基础使用

随机推荐

  1. 如果在android中应用activemq
  2. Android应用程序键盘(Keyboard)消息处理机
  3. Android的Handler
  4. AndroidManifest.xml详解
  5. Android(安卓)NDK编译 ndk-build方式
  6. Android之使用Android-query框架进行开发
  7. android的binder机制研究(C++部分)
  8. Android(安卓)屏幕旋转(一):旋转设置
  9. android系统调用
  10. Content Provider的经典详细讲解