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-logging-log4j去实现log输出内容到sd卡中的文件的功能
  2. 目前最全的android恶意程序的分类谱
  3. Android中有用的组件被选中和按下去的变换样式
  4. APP开发实战114-Android(安卓)Studio打包介绍
  5. android rootfs
  6. android存取数据方式:文件、SharedPreferences
  7. Android——编译odex保护
  8. Android解析XML文件的三种方式
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android中tools属性的使用
  2. Android 开发者该学点Linux 命令了
  3. Android startActivityForResult request
  4. android Gallery3D效果
  5. android中定制的dialog
  6. Android(安卓)Interface Definition Lang
  7. java中org.xml.sax不能读取xml回车换行的
  8. android之MultiAutoCompleteTextView
  9. Android——Hardware Acceleration
  10. Android LocalSocket / LocalServerSocke