java即是混淆了,还是可以反编译出来,所以把关键的算法写到C++中,防止反编译。
1.建立java工程,名称为test02,主界面为MainActivity.java
2.在工程下建立jni目录,在jni目录下添加Android.mk和Hello.cpp这两个文件,文件内容如下所示。
Android.mkLOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE
LOCAL_SRC_FILES := Hello.cpp
LOCAL_SHARED_LIBRARIES := \
include $(BUILD_SHARED_LIBRARY)
Hello.cpp
using namespace android;
jint native_init(JNIEnv *env, jobject thiz)
{
}
static JNINativeMethod gMethods[] = {
};
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
bail:
}
//}; // namespace android
3.编译C++文件
test02目录拷贝到展讯的工程中,例如放到huaqin/packages/apps/目录下
展讯下编译为 ./mk -o=eng td830q u adr huaqin/packages/apps/test02/jni
生成的so库为 out/target/product/sp8830ec/system/lib/libhello.so
4.java文件修改
在用到这个so的java文件中,加上如下代码
4.编译工程
把生成的libhello.so拷贝到test02/libs/armeabi和test02/libs/armeabi-v7a下,使用eclipse编译这个工程,得到的代码放到手机上就可以用了。
常见错误及处理
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libhello_jni 是因为loadLibrary的第一个参数不是libhello,而应该改成hello
Caused by: java.lang.NoClassDefFoundError: 把RegisterNatives函数的第一个参数改成调用者的类名,就ok了。