RJNI raises the cost of extracting logic from a shipped Java application. It does not claim to defeat a determined, well-resourced reverse-engineering effort against a native binary. No protection tool in this category can make that claim, and RJNI does not.
| Tier | Capability | Posture |
|---|---|---|
| Casual | Runs an off-the-shelf decompiler against the shipped JAR, no further effort. | The primary tier RJNI is built to raise the cost against, nativization removes the method body a decompiler would otherwise reconstruct. |
| Motivated amateur | Reads native-library disassembly, uses
javap/bytecode viewers, spends time on strings and symbols. |
Partially raised: string/resource encryption and decompiler-resistant wrapping increase the cost here, without fully defeating this tier. |
| Determined reverser | Has the native binary, a disassembler, time, and the skill to reconstruct logic from native code by hand. | Out of scope. RJNI raises the cost of extraction; it does not claim to defeat a determined effort against the compiled native artefact. |
An attacker targets a Java application for one of two reasons: extracting proprietary business logic (an algorithm, pricing logic, a licensing check, domain-specific IP, the core value of nativizing and obfuscating a method), and bypassing an embedded licence or DRM check. The second is why loader and runtime hardening exists, the small bootstrap that loads the native library is the lowest-effort attack surface for someone trying to patch out a licence gate without breaking the native protection at all, so it goes through the same protection pipeline as your own code instead of being left unobfuscated.
RegisterNatives is a name-based JNI API, so a nativized method's name and descriptor remain visible as plaintext strings inside the compiled native library, structurally unavoidable without abandoning JNI as the relinking mechanism.