手动写Makefile编译Android NDK的so
16lz
2021-01-23
之所以摒弃NDK,是因为NDK编译出来的so太大,而且导出表总有一些没用的符号。而且手动编译的话,可以得到编译过程中间的.i和.s文件,可以删除一些没用的汇编代码。
现在代码列出来:
我的NDK C的代码如下,main.c:
#include #include #include #ifndef __ANDROID_LOGCAT_H__#define __ANDROID_LOGCAT_H__#define TEST_DEBUG 1#ifdef TEST_DEBUG#include #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__)#else #define LOGI(...) {}#define LOGD(...) {}#define LOGW(...) {}#define LOGE(...) {}#define LOGF(...) {}#endif #endif#define LOG_TAG "ss"int encrypt() {int i = 0;char plaintext[128] = "abcdefg";LOGI("in encrypt!");return i;}JNIEXPORT jint Java_com_ss_jni_JNIUtil_nativec(JNIEnv *env, jclass thizz) {encrypt();return 1;}
NDK_ROOT=D:\eclipse-android\android-ndk-r9dTOOLCHAINS_ROOT=$(NDK_ROOT)\toolchains\arm-linux-androideabi-4.6\prebuilt\windowsTOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)\bin\arm-linux-androideabiTOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)\lib\gcc\arm-linux-androideabi\4.6\include-fixedPLATFORM_ROOT=$(NDK_ROOT)\platforms\android-19\arch-armPLATFORM_INCLUDE=$(PLATFORM_ROOT)\usr\includePLATFORM_LIB=$(PLATFORM_ROOT)\usr\libCC := $(TOOLCHAINS_PREFIX)-gccFLAGS=-I$(TOOLCHAINS_INCLUDE) \-I$(PLATFORM_INCLUDE) \-L$(PLATFORM_LIB) \-fPIC \-shared \-llog \MODULE_NAME=helloCFLAGS = -Wall -gLDFLAGS = -llog -sharedSRC =hello.cEXE =librusteze.soall:$(CC) -E $(MODULE_NAME).c $(FLAGS) -o $(MODULE_NAME).i$(CC) -S $(MODULE_NAME).i $(FLAGS) -o $(MODULE_NAME).s$(CC) -c $(MODULE_NAME).s $(FLAGS) -o $(MODULE_NAME).o$(CC) $(MODULE_NAME).o $(FLAGS) -o lib$(MODULE_NAME).so$(TOOLCHAINS_PREFIX)-strip lib$(MODULE_NAME).soclean:$(RM) $(MODULE_NAME).i $(MODULE_NAME).s $(MODULE_NAME).o $(EXE)
可以看到首先gcc -E预编译
接下来gcc -S 编译
gcc -c汇编
strip隐藏符号和函数名字
D:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc -E main.c -ID:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6\include-fixed -ID:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\include -LD:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\lib -fPIC -shared -llog -o main.iD:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc -S main.i -ID:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6\include-fixed -ID:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\include -LD:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\lib -fPIC -shared -llog -o main.sD:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc -c main.s -ID:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6\include-fixed -ID:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\include -LD:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\lib -fPIC -shared -llog -o main.oD:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc main.o -ID:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6\include-fixed -ID:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\include -LD:\eclipse-android\android-ndk-r9d\platforms\android-19\arch-arm\usr\lib -fPIC -shared -llog -o librusteze.soD:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-strip librusteze.so
编译成功:
得到librusteze.so
新建一个Android工程testso:
public class JNIUtil {static {System.loadLibrary("rusteze");}public static native int nativec();}
在MainActivity中调用JNIUtil.nativec();
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);JNIUtil.nativec();}}
可以看到logcat中打印出来的日志。
可以达到缩小so的目的,还有导出表里也没有那些奇怪的导出符号了。
见下图:
但是导入表也没有了,见下图:
android工程代码在github上点击打开链接
更多相关文章
- Android 中颜色对应的代码集合
- 《Android 编程权威指南》(Android Programming The Big Nerd Ran
- 美团,大众点评,悬浮窗功能代码
- Android 第一行代码
- android下图片压缩 -- 图像处理
- android 100行代码实现 仿苹果滑动选择器WheelView
- Android之图文混排 (二)源代码