当前位置: 首页 > 知识库问答 >
问题:

Android NDK是否加密编译的c文件?

巩枫
2023-03-14

我的Android项目中有一个C文件(native lib.cpp):

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_keysnative_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string api_key = "0123456789abcdef";
    return env->NewStringUTF(api_key.c_str());
}

当我构建项目并解包apk时,这个文件将被编译成二进制文件:lib/x86/libnative lib。所以。

如果我尝试将此文件导入并使用到另一个项目中,则会出现错误:

public class Main {

    static {
        try {
            System.load("/Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so");
        } catch (UnsatisfiedLinkError e) {
            System.err.println(e);
            System.exit(1);
        }
    }
}

Java语言lang.UnsatisfiedLinkError:/Users/u/Playground/KeysNative/app debug/lib/x86/libnative lib。因此:dlopen(/Users/u/playfield/KeysNative/app debug/lib/x86/libnative-lib.so,1):未找到合适的映像。确实找到了:/Users/u/Playground/KeysNative/app debug/lib/x86/libnative lib。so:未知文件类型,前八个字节:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00/Users/u/Playground/KeysNative/app debug/lib/x86/libnative lib。so:未知文件类型,前八个字节:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00

问题:这些文件是否使用要编译的项目中的java密钥库,或任何其他类型的签名?


共有2个答案

漆雕和昶
2023-03-14

正如@Michael所说,由于. so是从Android NDK生成的,它包含Android依赖项,因此只能在Android系统上运行。

童子明
2023-03-14

您不能从移动设备上的计算机文件系统加载本机汇编。

这应该已经足以链接程序集:

static {
    try {
        System.loadLibrary("libnative-lib");
    } catch (UnsatisfiedLinkError e) {
        Log.e(LOG_TAG, "" + e.getMessage());
    }
}

但是,如果您只有x86程序集,这将仅适用于x86Android模拟器。

 类似资料:
  • 我想把我的C#(托管)解密方法转换成Android NDK, C/C(NO JAVA) 我看到有加密。在JAVA方面,但我想远离任何JNI,我还看到有mcrypt和crypt,但找不到适用于android的编译库。 这里有一个C#的例子,我想把它翻译成C/C 更新到目前为止,我发现最好的方法是使用openSSL AES,我已经下载了一个预编译的Android库,我只是在努力让它与一些已经发布的示例

  • 问题内容: 编译文件时,它还会将javadocs和注释嵌入到类文件中吗? 例如,如果您有大型javadocs,是否会影响类文件的整体大小?还是编译器会忽略以和开头的所有内容? 问题答案: 否。有几个调试选项会影响类文件的大小,但注释永远不会成为结果文件的一部分。 一些估计: 只是添加行号信息(几个字节) 包括所有变量的全名。这通常是最昂贵的选择。 只需添加源文件的名称(无路径)。 注意:通过反射可

  • 问题内容: 我想知道为什么我们通过编译显示“ Hello,World!”的.c文件得到.o文件。是否大于Java .class文件,该文件也显示“ Hello,World!”? 问题答案: Java使用字节码来独立于平台并进行“预编译”,但是字节码由解释器使用并且被提供为足够紧凑,因此您在已编译的C程序中看到的机器代码并不相同。只需看一下Java编译的完整过程即可: 这是Java程序到机器代码转换

  • 本文向大家介绍Python编译成.so文件进行加密后调用的实现,包括了Python编译成.so文件进行加密后调用的实现的使用技巧和注意事项,需要的朋友参考一下 pyc的破解相对容易,使用cython将python文件编译成.so文件,能在一定程度上增强python源码的私密性。 编译成.so文件 环境准备:cython 测试脚本准备:test.py 脚本编译准备: 3.1 编写compile.py

  • 问题内容: 我正在用Java实现与第三方应用程序的通信。作为登录过程的一部分,第三方应用程序正在发送一个加密的字符串,我必须对其进行解码并发回。我已经花了将近2天的时间进行糊涂和阅读文章,但是我找不到实现此目的的正确方法。 我有一个测试用例,其中加密的字符串为“ c1W2YO1vYQzu6czteEidrG0U4g5gT4h57vAlP7tdjcY =“,使用密码“ GAT”解密的字符串必须返回“