http://my.oschina.net/liucundong/blog/161646
说明
我们开发的Android应用,大部分代码使用Java实现,当应用被反编译之后,一切信息都是暴漏出来的,如果一些信息我们希望不被暴漏出来,如:加密算法的密钥、在各大开放平台申请得到的AppKey、AppSecret等,为了解决这个问题,我们可以使用*.so文件将这些信息隐藏起来,并在Java中使用JNI调用。
实现
首先需要下载NDK并搭建开发环境
http://developer.android.com/tools/sdk/ndk/index.html
环境搭建成功之后,可按照以以下步骤实现:
1.首先,创建一个普通的Android项目(TestJNI),并为该项目增加Native Support;
2.编写使用本地方法的Java代码;
1
2
3
4
|
package
com.example.testjni;
public
class
CommonUtils {
public
static
native
String getSecret();
}
|
3.生成jni需要的头文件;
到TestJNI/bin/classes目录中,运行命令:javah -jni com.example.testjni.CommonUtils
之后,在该目录下将会生成头文件:com_example_testjni_CommonUtils.h
4.编写C代码;
将com_example_testjni_CommonUtils.h拷贝到TestJNI\jni\目录,并且删除该目录下eclipse自动生成的TestJNI.cpp(Eclipse自动生成的),然后新建com_example_testjni_CommonUtils.h.c。
内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/*
* com_example_testjni_CommonUtils.c
*
* Created on: 2013-9-13
* Author: cundong
*/
#include <jni.h>
#include <com_example_testjni_CommonUtils.h>
JNIEXPORT jstring JNICALL Java_com_example_testjni_CommonUtils_getSecret
(JNIEnv * env, jclass thiz){
return
(*env)->NewStringUTF(env,
"http://www.baidu.com"
); //c
}
|
5.修改Android.mk文件
内容如下:
1
2
3
4
5
6
7
8
|
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestJNI
LOCAL_SRC_FILES := com_example_testjni_CommonUtils.c
include $(BUILD_SHARED_LIBRARY)
|
编译工程,得到:TestJNi\libs\armeabi\libTestJNI.so
7.在Java代码中使用该so文件
(1)加载so(确保调用该so文件的libs\armeabi目录中存在该so文件):
1
2
3
|
static
{
System.loadLibrary(
"TestJNI"
);
}
|
1
2
|
String str = CommonUtils.getSecret();
Toast.makeText(
this
,
"str->"
+str, Toast.LENGTH_SHORT).show();
|
注意事项
如果遇到:Method 'NewStringUTF' could not be resolved 问题,可以使用如下方式解决:
Go to the project's Properties -> C/C++ General -> Code Analysis. Click the "Use project settings" radio button (or "Configure Workspace Settings..." button). Disable (uncheck) the "Method cannot be resolved" checkbox.
http://stackoverflow.com/questions/15899813/eclipse-method-newstringutf-could-not-be-resolved
如果遇到:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8