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);
很明显,这个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结果查看


浙公网安备 33010602011771号