Правильно, нет способа предотвратить повторное использование .so вредоносным агентом. Поэтому ваш нативный API никогда не должен раскрывать секретную информацию стороне Java. Вы можете выполнить некоторую проверку в своих собственных методах, чтобы проверить, действительно ли вызывающая Java принадлежит легитимному APK.
С другой стороны, не стоит недооценивать другую уязвимость нативного кода: ваш .so может быть разобран с помощью соответствующих инструментов, и любая защита может быть оторвана. Существуют средства обфускации и устойчивости к обратному проектированию для нативного кода, но кривая заработка для них намного круче, чем с ProGuard.
Тем не менее, стоит, по крайней мере, не хранить API-ключ в виде обычного текста в коде C ++. Попробуй себя запустить
strings libnative.so
( здесь libnative.so - это файл .so, извлеченный из вашего APK ), и вы можете обнаружить важную информацию, которая ожидает кражи из вашей библиотеки, не требуя сложного обратного инжиниринга.
Что касается ProGuard, он не добавляет защиты к используемым вами нативным методам. Вы даже не можете запутать имя класса и имя метода для нативного метода. ( Ну, это возможно, но очень сложно, и нет никаких инструментов, которые могут помочь с такой настройкой ).