将C ++项目迁移到Java,保护实现细节

时间:2017-03-31 20:05:38

标签: java c++ jar migrating

我有一个非常复杂的项目,可以从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版本)

2 个答案:

答案 0 :(得分:2)

结帐proguard。它至少会混淆jar文件,否则它基本上是人类可读的。逆向工程并不是绝对安全,但我想这两者都不是。

我不是Java专家,但这是我们过去为保护实施所做的工作。

我不确切知道Java端口的动机是什么,但如果它只是为了支持Java最终用户,您可以考虑使用JNI包装器。我想这可能不是这样,但我想我会提到它。

就向用户公开接口代码而言,您可以编写一个Java接口类(如纯虚拟抽象c ++类),而不是简单地编写该类。

答案 1 :(得分:1)

回答如何向用户显示公共方法的问题。这通常是通过声明内部类而不使用访问修饰符的组合来完成的,这使得它们只能从同一个包中访问,而不能记录它们。不过不依赖于前者,它很容易绕过,但它会向用户发送这些类是内部的消息。

Java 9添加了允许您封装整个软件包的模块,但它还没有在这里,您仍然可以绕过封装。

提前编译的一个副作用(通常是C ++的情况)是分布式代码已经优化,并且不包含元数据,因此反向工程更难。 Java以中间语言分发,但实际的机器代码是在运行时生成的(JIT编译)。中间语言实际上未经优化,因此反向工程更容易。 Java还合并了头文件和源文件的概念,其中.class文件将包含您使用它所需的所有元数据。