我有一个非常复杂的项目,可以从C ++(Linux)迁移到Java 目前,C ++版本作为共享库(.so)分发,后跟顶级接口头类。最终用户完全隐藏了实现细节。
这个问题不是关于将C ++代码移植到Java,而是关于创建类似的分发包。
我们假设我有一个非常简单的公众' C ++中的类,topapi.h
:
class TopApi
{
public:
void do( const string& v );
}
实际的实现对API用户是隐藏的。实际项目可能包含另外100个文件/类do()将调用。
该发行版将包含2个文件:topapi.so和topapi.h
用户将在其代码中#include "topapi.h"
,并将其应用与topapi.so
链接。
问题是: 1.如何在Java中实现类似的效果(隐藏IP相关代码) 2.如何向用户显示公共方法(与代码保护无关,只是上面头文件的java版本)
答案 0 :(得分:2)
结帐proguard。它至少会混淆jar文件,否则它基本上是人类可读的。逆向工程并不是绝对安全,但我想这两者都不是。
我不是Java专家,但这是我们过去为保护实施所做的工作。
我不确切知道Java端口的动机是什么,但如果它只是为了支持Java最终用户,您可以考虑使用JNI包装器。我想这可能不是这样,但我想我会提到它。
就向用户公开接口代码而言,您可以编写一个Java接口类(如纯虚拟抽象c ++类),而不是简单地编写该类。
答案 1 :(得分:1)
回答如何向用户显示公共方法的问题。这通常是通过声明内部类而不使用访问修饰符的组合来完成的,这使得它们只能从同一个包中访问,而不能记录它们。不过不依赖于前者,它很容易绕过,但它会向用户发送这些类是内部的消息。
Java 9添加了允许您封装整个软件包的模块,但它还没有在这里,您仍然可以绕过封装。
提前编译的一个副作用(通常是C ++的情况)是分布式代码已经优化,并且不包含元数据,因此反向工程更难。 Java以中间语言分发,但实际的机器代码是在运行时生成的(JIT编译)。中间语言实际上未经优化,因此反向工程更容易。 Java还合并了头文件和源文件的概念,其中.class
文件将包含您使用它所需的所有元数据。