之所以摒弃NDK,是因为NDK编译出来的so太大,而且导出表总有一些没用的符号。而且手动编译的话,可以得到编译过程中间的.i和.s文件,可以删除一些没用的汇编代码。
现在代码列出来:
我的NDK C的代码如下,main.c:
[html] view plain copy
#include <stdio.h>
#include <string.h>
#include <jni.h>
#ifndef __ANDROID_LOGCAT_H__
#define __ANDROID_LOGCAT_H__

#define TEST_DEBUG 1

#ifdef TEST_DEBUG

#include <android/log.h>
#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文件的写法:
[html] view plain copy
NDK_ROOT=D:\eclipse-android\android-ndk-r9d
TOOLCHAINS_ROOT=$(NDK_ROOT)\toolchains\arm-linux-androideabi-4.6\prebuilt\windows
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)\bin\arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)\lib\gcc\arm-linux-androideabi\4.6\include-fixed
PLATFORM_ROOT=$(NDK_ROOT)\platforms\android-19\arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)\usr\include
PLATFORM_LIB=$(PLATFORM_ROOT)\usr\lib
CC := $(TOOLCHAINS_PREFIX)-gcc

FLAGS=-I$(TOOLCHAINS_INCLUDE) \
-I$(PLATFORM_INCLUDE) \
-L$(PLATFORM_LIB) \
-fPIC \
-shared \
-llog \

MODULE_NAME=hello
CFLAGS = -Wall -g
LDFLAGS = -llog -shared
SRC =hello.c
EXE =librusteze.so

all:
$(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).so

clean:
$(RM) $(MODULE_NAME).i $(MODULE_NAME).s $(MODULE_NAME).o $(EXE)
可以看到首先gcc -E预编译
接下来gcc -S 编译
gcc -c汇编
strip隐藏符号和函数名字

在Windows平台,CMD命令行执行mingw32-make。(前提是装了MinGW,并且配置了环境变量)
[html] view plain copy
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.i
D:\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.s
D:\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.o
D:\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.so
D:\eclipse-android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-strip librusteze.so

编译成功:
得到librusteze.so
新建一个Android工程testso:
[html] view plain copy
public class JNIUtil {
static {
System.loadLibrary("rusteze");
}
public static native int nativec();
}
在MainActivity中调用JNIUtil.nativec();
[html] view plain copy
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JNIUtil.nativec();

}
}

可以看到logcat中打印出来的日志。
可以达到缩小so的目的,还有导出表里也没有那些奇怪的导出符号了。
见下图:

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

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

手动写Makefile编译Android NDK的so的更多相关文章

  1. Linux命令行下编译Android NDK的示例代码

    这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android ND ...

  2. Openblas编译Android NDK库的步骤

    1.配置Android NDK编译工具.以下下载地址,直接放到浏览器中下载,不需要VPNlinux 32 bithttp://dl.google.com/android/ndk/android-ndk ...

  3. mac系统下命令编译android ndk项目

    1.设置ndk环境变量 2.构造android ndk项目,命令:ndk-build 3.使用ant构造android sdk项目:命令:android update project -p . -n ...

  4. 一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件

    通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...

  5. android NDk环境编译总结

    首先,这篇文章的撰写是基于很多前人的优秀的帖子,感谢他们的分享让我能够学习这么多的知识.谢谢 Android NDK开发环境的搭建 前言: Android 上,应用程序的开发,大部分基于 Java 语 ...

  6. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  7. eclipse里配置Android ndk环境,用eclipse编译.so文件

    做Android NDK开发时,c代码需要用ndk-build来进行编译,而java代码则需要用Android sdk编译. 编译c代码有两种方法: 一.写好c代码后,然后用cygwin搭建ndk-b ...

  8. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  9. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

随机推荐

  1. java正则匹配正则表达式

    1.简单匹配小案例 public static void main( String[] args ){ // 按指定模式在字符串查找 String line = "This order wa ...

  2. 关于Goroutine与Channel

    关于Goroutine的原理 原理上的内容比较多,比如goroutine启动的时候要执行哪些相关的操作,一点一点的补充一下. channel的基本原理 channel是go语言中的特殊的机制,既可以同 ...

  3. ssh-config的使用

    使用SSH的配置文件可以在很大程度上方便各种操作,特别适应于有多个SSH帐号.使用非标准端口或者写脚本等情况. man ssh_config 可以查看手册 如果之前是用密码方式来登录SSH,需要先改用 ...

  4. 第五周课程总结&试验报告(三

    实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is a test of java".按要求执 ...

  5. Spring Boot 深度调优,6得飞起~

    项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 一.修改配置文件 关于修改配置文件applicati ...

  6. JS案例经验二

    一 关键词:鼠标事件的触发 可以在函数中指定让鼠标事件自动触发,而不是必须要鼠标滑过才触发,例如: main.onmouseover(); // 可以把该语句看做是鼠标滑过的模拟动作 main是DOM ...

  7. 使用Docker部署Spring-Boot+Vue博客系统

    在今年年初的时候,完成了自己的个Fame博客系统的实现,当时也做了一篇博文Spring-boot+Vue = Fame 写blog的一次小结作为记录和介绍.从完成实现到现在,也断断续续的根据实际的使用 ...

  8. 手摸手教你如何在 Python 编码中做到小细节大优化

    手摸手教你如何在 Python 编码中做到小细节大优化 在列表里计数 """ 在列表里计数,使用 Python 原生函数计数要快很多,所以尽量使用原生函数来计算. &qu ...

  9. mongoose 数据库操作2

     mongoose的内置的主要功能解说 除了定义文档结构和你要存储的数据类型外.模式(Schema)还用于下面定义: ·        Validators (异步和同步) ·        Defa ...

  10. 2019 湖湘杯 Reverse WP

    0x01 arguement 下载链接:https://www.lanzous.com/i7atyhc 1.准备 获取到信息: 32位的文件 upx加密文件 在控制台打开文件 使用"upx ...