2017-03-31 41 views
2

我有一个相当复杂的项目,需要从C++(Linux)迁移到Java 当前,C++版本是作为共享库(.so)分布的,随后是顶级接口头文件类。实现细节从最终用户完全隐藏。将C++项目迁移到Java,保护实现细节

这个问题不是关于将C++代码移植到Java,而是关于创建类似的分发包。

假设我有一个非常简单的“公共”类在C++中,topapi.h

class TopApi 
{ 
public: 
    void do(const string& v); 
} 

实际实现从API用户隐藏。实际的项目可能会包含do()将调用的另外100个文件/类。

分配将包含2个文件:topapi.so和topapi.h

用户将#include "topapi.h"在他们的代码,并与topapi.so链接他们的应用程序。

问题是: 1.如何在Java中实现类似效果(隐藏IP相关代码) 2.如何向用户显示公共方法(与代码保护无关,只是Java版本上面的头文件)

+3

*“我怎样才能在Java中实现类似的效果?”*与使用任何其他专有产品相同的方式:许可协议中的NDA和反向逆向工程条款。 – cdhowie

+2

这真的是一个关于混淆的问题吗?或者你只是想只公开API给用户? –

+1

伟大的问题!其实,它们都是。虽然我在第一个问题上得到了答案(混淆),但第二个答案保持开放。我会尝试更新这个问题。 –

回答

2

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

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

我不确切知道Java端口的动机是什么,但如果只是为了支持Java最终用户,您可以考虑一个JNI包装器。我想这可能不是这样,但我想我会提到它。就接口代码暴露给用户而言,你可以编写一个Java接口类(就像纯粹的虚拟抽象C++类),并且不需要编程该类。

+1

谢谢。这是针对Java最终用户的,我们确实考虑过JNI选项。问题是我们的情况下性能是至关重要的。应该从Java环境调用现有的代码(目前是C++),执行一些繁重的计算,并将大量结果返回给调用者。在这种情况下,我担心JNI会完全扼杀性能。 Byu的方式,.so文件*相对*安全的转。如果使用相应的标志生成,显然,调试信息被删除。 –

+0

我只是将一堆性能关键的数值计算从Java移植到C++。再次,我不是一个Java专家,但JNI层可能不是你唯一的问题。就我而言,我正在与一个中等大矩阵(20-40个元素平方)的EKF一起工作。我非常肯定有办法让Java具有竞争力,但还有其他原因,我们会喜欢C++实现。 –

1

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

Java 9增加了一些模块,可以封装整个软件包,但目前还没有,您仍然可以绕过封装。

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