2017-03-31 54 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文件將包含您需要使用的所有元數據。