之所以摒弃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;}


下面是Makefile文件的写法:

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隐藏符号和函数名字


在Windows平台,CMD命令行执行mingw32-make。(前提是装了MinGW,并且配置了环境变量)

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的目的,还有导出表里也没有那些奇怪的导出符号了。

见下图:

手动写Makefile编译Android NDK的so_第1张图片

但是导入表也没有了,见下图:

手动写Makefile编译Android NDK的so_第2张图片


android工程代码在github上点击打开链接

更多相关文章

  1. Android 中颜色对应的代码集合
  2. 《Android 编程权威指南》(Android Programming The Big Nerd Ran
  3. 美团,大众点评,悬浮窗功能代码
  4. Android 第一行代码
  5. android下图片压缩 -- 图像处理
  6. android 100行代码实现 仿苹果滑动选择器WheelView
  7. Android之图文混排 (二)源代码

随机推荐

  1. 禁止横竖屏自动切换
  2. 中国Android应用商店汇总
  3. android 状态栏移动到底部
  4. 一个简单、漂亮、功能强大的Android日志
  5. android UI之去掉状态栏
  6. Android中调用摄像头拍照保存,并在相册中
  7. android中 JIN编译报错
  8. Android中的全屏
  9. Android的System Server
  10. android版本兼容问题总结