【代码保护】算法写进C++

本文介绍如何通过将关键算法写入C++来保护Java应用免受反编译威胁,包括设置Java工程、编写C++和JNI代码、编译及链接步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java即是混淆了,还是可以反编译出来,所以把关键的算法写到C++中,防止反编译。

1.建立java工程,名称为test02,主界面为MainActivity.java

2.在工程下建立jni目录,在jni目录下添加Android.mk和Hello.cpp这两个文件,文件内容如下所示。

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE    := libhello
LOCAL_SRC_FILES := Hello.cpp
LOCAL_SHARED_LIBRARIES := \
    libandroid_runtime
include $(BUILD_SHARED_LIBRARY)

 

Hello.cpp

using namespace android;

jint native_init(JNIEnv *env, jobject thiz)
{
   return 100;
}

static JNINativeMethod gMethods[] = {
    {"native_init",       "()I",          (void *)native_init},
};

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env = NULL;
    jint result = -1;
    jclass clazz_vtmgr = NULL;
    jclass clazz_recorder = NULL;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        goto bail;
    }
    assert(env != NULL);

    clazz_vtmgr = env->FindClass("com/example/test02/MainActivity");
    if (clazz_vtmgr == NULL) {
        goto bail;
    }

    env->ExceptionClear();

    if (env->RegisterNatives(clazz_vtmgr, gMethods, NELEM(gMethods)) != JNI_OK)
        goto bail;

    result = JNI_VERSION_1_4;

bail:
    env->DeleteLocalRef(clazz_vtmgr);
    return result;
}

//}; // 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文件中,加上如下代码

  static
  {
   System.loadLibrary("hello");
  }
     private native final int native_init();

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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值