首页
社区
课程
招聘
[转帖]APK反破解之三:NDK编译.so动态库
发表于: 2011-10-26 23:54 54470

[转帖]APK反破解之三:NDK编译.so动态库

2011-10-26 23:54
54470

说明:由于最近很忙,老项目被砍掉,新项目刚立项。加之NDK的文章网上已有不少。因此,这一篇文章转自网络。原文链接在此: 《Android: NDK编程入门笔记》

APK反破解之三:NDK编译.so动态库

为何要用到NDK?

前段时间,工作中需要用android的应用程序访问android的根文件系统中的文件,但是由于应用程序的权限限制,无法访问这些文件,怎么办? 所以这就要用到了NDK编程了,既用C/C++代码实现访问系统文件,并将其生成本地库,供android中的java代码调用,这样就可以在java代码中通过调用C/C++编写的库的接口来实现对系统文件的访问。

下面就介绍下Android NDK的入门学习过程:

入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。

一、 开发环境的搭建

a.  android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。

b. 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库

c. android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

如何下载和安装android-ndk我这里就不啰嗦了,安装完之后,需要将android-ndk的路劲加到环境变量PATH中:

sudo gedit /etc/environment
source  /etc/environment
ndk-bulid
Android NDK: Could not find application project directory !    
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.
/* 
 * Copyright (C) 2009 The Android Open Source Project 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. */
 
 package com.example.hellojni;
 import android.app.Activity;
 import android.widget.TextView;
 import android.os.Bundle;
 
 public class HelloJni extends Activity{    
        /** Called when the activity is first created. */    
        
        @Override    
        public void onCreate(Bundle savedInstanceState)    {        
               super.onCreate(savedInstanceState);        
               /* Create a TextView and set its content.         
                * the text is retrieved by calling a native         
                * function.         */        
                
               TextView  tv = new TextView(this);        
               tv.setText( stringFromJNI() );        
               setContentView(tv);    
        }    
        /* A native method that is implemented by the     
         * 'hello-jni' native library, which is packaged     
         * with this application.     */    
         
         public native String  stringFromJNI();    
         /* This is another native method declaration that is *not*     
          * implemented by 'hello-jni'. This is simply to show that     
          * you can declare as many native methods in your Java code     
          * as you want, their implementation is searched in the     
          * currently loaded native libraries only the first time     
          * you call them.     
          *     
          * Trying to call this function will result in a     
          * java.lang.UnsatisfiedLinkError exception !     */    
          
         public native String  unimplementedStringFromJNI();    
         /* this is used to load the 'hello-jni' library on application     
          * startup. The library has already been unpacked into    
          * /data/data/com.example.HelloJni/lib/libhello-jni.so at     
          * installation time by the package manager.     
          */    
         
         static {        
                System.loadLibrary("hello-jni");    
         }
 }
braincol@ubuntu:~$ cd workspace/android/NDK/hello-jni/ 
braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls 
AndroidManifest.xml  assets  bin  default.properties  gen  res  src 
braincol@ubuntu:~/workspace/android/NDK/hello-jni$ mkdir jni 
braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls 
AndroidManifest.xml  assets  bin  default.properties  gen  jni  res  src 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (15)
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
第四篇 类动态加载 的文章很早已经写好。可惜没时间传。
今天又晚了,我争取在周末发出来吧。。。
2011-10-26 23:57
0
雪    币: 73
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持楼主 一直关注你的帖子
2011-11-2 19:47
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以多关注dalvik是怎么实现java对JNI调用的。其中会涉及到怎么定位一个native func,有文章可做。
2011-11-13 00:39
0
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
大侠高明~ 可否写一篇文章分析下?多谢了~
2011-11-16 08:45
0
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文章!楼主很辛苦!!
2011-12-13 15:45
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
牛啊,一个很好的思路,嘿嘿,确实有文章可做
2012-2-3 15:41
0
雪    币: 2734
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了,好文章!必顶。
2012-2-14 09:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
liunix不熟啊。蛮麻烦的
2012-2-16 22:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
怎么防止自己的 SO库被人使用呢
2012-4-3 19:13
0
雪    币: 265
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主厉害,NDK也去反编,不过SDK应用确实反编太容易了
2012-11-19 19:23
0
雪    币: 3
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我们也有Android下的应用呢,也得学学。
2012-11-19 22:41
0
雪    币: 322
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了,继续跟进
2013-7-6 23:58
0
雪    币: 1552
活跃值: (1626)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
以后在学习
2013-7-27 10:49
0
雪    币: 1585
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark 学习一下
2013-9-25 21:51
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢了!非常好的文章
2013-12-4 23:36
0
游客
登录 | 注册 方可回帖
返回
//