Two things come to mind:
1). If you have any possibility to run the C++ code as a separate process (use any RPC technique to communicate) then you dodge this problem, albeit at the expense of performance.
2). You are at the mercies of the C++/JNI developer. Most problems I've encourntered are at the "skin" of the JNI layer. That is, I had a reasonbably stable, existing library which I wrapped in JNI. The library would get upset if I inadvertantly passed null pointers to the existing code, and if I failed to check for nulls in response I could also have issues. So we put a lot of effort into sanitising that wrapper layer. Anywhere where there was a possibility for unexpected results we added checking.
Of course if the whole library is new, then life is harder - in the end you simply have to produce robust code.