I'm using JNI to accelerate my program. It's like this:

```
JNIEXPORT void JNICALL SOME_FUNCTION(JNIEnv * jenv, jclass, jlong thiz)
{
  ...
}

```

Here the java program send into the c the address of the objects in the RAM, and starts the c binary.

Though I know it is really fast to execute native directly, I'm still confused at the difference between JNI and a java wrapper. Because to my understanding, the java wrapper is also working on sending in the RAM address into the C binary.

What's the intrinsic difference made them different in efficiency?

Following is an illustration that might help you answer.

By "java wrapper", I mean things like JavaCV

![JNI illustration](https://i.stack.imgur.com/BsKbq.png)