AndroidNDK&JNI4---android C/C++ 层使用三方so

问题引入:http://blog.csdn.net/yf210yf/article/details/11713891

有时候,我们反编译apk得到一个so库,如果直接使用这个so库的话,必须使用原来so库同样的package名字,才能用。
这样人家反编译你的apk,就知道你侵犯了人家的版权。为了达到混淆的目的,我们可以再写一个so库调用人家的so库,即把人家的so库放到root的某个路径下,用c/c++语言调用这个so库。比如说,我得到一个APK,反编译这个APK看到下面的代码:

  

 1 static {
 2 
 3     try { 
 4 
 5         System.loadLibrary("NativeExampleActivity");
 6 
 7       } catch (Throwable t) {
 8 
 9       }
10 
11   } 
12 
13   public native int addFunction(int a, int b); 
14   public native String getString(String name);  
View Code

 

很明显,这个so库是libNativeExampleActivity.so, 库里面有两个native函数addFunction和getString。
虽然知道了这两个native函数,但是我们还不能直接使用,因为这两个native函数在so库里面的真实函数名不是addFunction和getString,
它在native函数名之前还有包名,所以必须使用nm命令,查看so库里面的函数名。
显示so库函数的命令:
nm -A libNativeExampleActivity.so
或者
nm -D libNativeExampleActivity.so
这样我们看到so库里的主要信息:
Java_org_natives_example_NativeExampleActivity_addFunction
Java_org_natives_example_NativeExampleActivity_getString
看到没有,在addFunction函数前面还有包名,这就是为什么直接使用人家的so库的时候,一定要使用原来的package名字

但是,也难不倒万能的程序员。如下:

1、项目结构视图

  注意:自定义文件内容与三方so文件无关。唯一与之有关的就是自己的so库。

2、创建自己的so库

  

1 //UseJni.java
2 public class UseJni {
3         public static native String stringFromJNI();
4         static{
5             System.loadLibrary("liyang");
6         }
7 }

 

 1 //com_example_liyangstatic_UseJni.c
 2 #include <string.h>
 3 #include <jni.h>
 4  #include <stdlib.h>
 5 #include <fcntl.h>
 6 #include <android/log.h>
 7 #include <stdio.h>
 8 #include <stdarg.h>
 9 #include <dlfcn.h>
10 
11 #include <android/log.h>
12 #define LOG_TAG "LY"
13 #define LOG(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)
14 
15 
16 jstring  (*stringFromJNI)(JNIEnv* , jclass);
17 void *filehandle = NULL;
18 
19   JNIEXPORT jstring JNICALL Java_com_example_liyangstatic_UseJni_stringFromJNI
20   (JNIEnv * env, jclass clss)
21 {
22     jstring re;
23     //事先把so库放在自己目录下
24     filehandle = dlopen("libhellostatic.so", RTLD_LAZY);
25 
26     LOG("filehandle:%d",(int)filehandle);
27 
28     if(filehandle)
29     {
30         LOG("2");
31         stringFromJNI=(jstring (*)(JNIEnv* , jclass))
32                 dlsym(filehandle,"Java_com_example_jnidemostatic_Hello_stringFromJNI");
33         if(stringFromJNI)
34         {
35             LOG("3");
36             re=stringFromJNI(env,clss);
37             dlclose(filehandle);
38             filehandle = NULL;
39             stringFromJNI=NULL;
40             return re;
41         }
42     }
43     return (*env)->NewStringUTF(env,"error !");
44 }
 1 #生成so文件的Android.mk
 2 LOCAL_PATH := $(call my-dir) 
 3 include $(CLEAR_VARS)
 4 LOCAL_MODULE := hellostatic
 5 LOCAL_SRC_FILES := libhellostatic.so
 6 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
 7 include $(PREBUILT_SHARED_LIBRARY)
 8 
 9 include $(CLEAR_VARS) 
10 LOCAL_MODULE    := liyang
11 LOCAL_SRC_FILES := com_example_liyangstatic_UseJni.c
12 LOCAL_C_INCLUDES :=$(LOCAL_PATH)
13 LOCAL_LDLIBS +=-llog -lm
14 LOCAL_SHARED_LIBRARIES += libhellostatic
15 include $(BUILD_SHARED_LIBRARY)

 

3、apk结果查看

 

posted @ 2015-11-24 20:00  何人之名  阅读(401)  评论(0)    收藏  举报