Android JNI System.loadLibrary не нужен? - PullRequest
2 голосов
/ 03 августа 2010

Мне нужна ваша помощь, чтобы немного лучше понять JNI на Android.Я просматривал пакет / libcore / x-net в Android и заметил, что Apache Harmony является поставщиком по умолчанию для функций SSL (с использованием OpenSSL).

Везде, где я нашел в Интернете, говорится, что когдаВы используете JNI в Android, вы должны загрузить нативный код с помощью метода System.loadLibrary (...), но я не вижу, где Apache Harmony вообще использует это.Я не совсем понимаю, как их родной код загружается.Нигде в своем коде Java они никогда не загружают свою собственную библиотеку.

/ libcore / x-net / src / main / java / org ... [Java Code of JNI] / libcore / x-net / src / main / native /... [C ++ код для JNI]

Крис

Ответы [ 2 ]

5 голосов
/ 04 августа 2010

Chrisc,

Чтобы отслеживать добавление нового провайдера, вы можете добавлять файлы в любое место, в том числе в приложении.В Android уже есть несколько провайдеров, зарегистрированных в разных пакетах.Например, в dalvik / libcore / security / src / main / java / java / security / Security.java

// Register default providers
private static void registerDefaultProviders() {
    secprops.put("security.provider.1", "org.apache.harmony.security.provider.cert.DRLCertFactory");  //$NON-NLS-1$ //$NON-NLS-2$
    secprops.put("security.provider.2", "org.apache.harmony.security.provider.crypto.CryptoProvider");  //$NON-NLS-1$ //$NON-NLS-2$
    secprops.put("security.provider.3", "org.apache.harmony.xnet.provider.jsse.JSSEProvider");  //$NON-NLS-1$ //$NON-NLS-2$
    secprops.put("security.provider.4", "org.bouncycastle.jce.provider.BouncyCastleProvider");  //$NON-NLS-1$ //$NON-NLS-2$
}

, а также избыточно в libcore / security / src / main / java / java / security /security.properties

Однако, даже если вы добавите свои собственные классы в тот же пакет, это не повлияет на существующего провайдера.Это потому, что классы Provider, такие как в данном случае JSSEProvider, определяют, какие классы используются для обеспечения различных реализаций алгоритма (через свойства, которые вы видите выше)

В вашем случае вы, вероятно, захотите предоставить новыйРеализация SSLContext.В JSSEProvider вы можете видеть, что он регистрирует SSLContextImpl для предоставления реализации SSLContext «TLS» (иначе SSL): put («SSLContext.TLS», SSLContextImpl.class.getName ());

Таким образом, вы можете добавитьваш собственный провайдер, который регистрирует альтернативную реализацию.

Вам не нужно добавлять своего провайдера в Security.java или security.properties, но вы можете использовать Security.addProvider для добавления нового или даже Security.insertProviderAt для управления тем, где ваш провайдер будет отображаться в порядке приоритета.

После регистрации вашего собственного провайдера вы можете убедиться, что вы получаете экземпляр от своего нового провайдера, используя SSLContext.getInstance ("SSLContext", "your-имя провайдера").В качестве альтернативы, если ваш поставщик имеет более высокий приоритет, чем встроенный, все программы, вызывающие SSLContext.getInstance ("SSLContext"), получат вашу новую реализацию.

Еще одно замечание: SSLSocket также можно создавать с помощью SSLSocketFactory.getDefault ().Это можно переопределить, чтобы использовать свой собственный SSLSocketFactory с ssl.SocketFactory.provider = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl (глядя на SSLSocketFactory.getDefault).Я не уверен, что это можно сделать в приложении, в отличие от добавления нового поставщика.

Наконец, что касается кода C ++, вы, очевидно, можете предоставить свой собственный собственный код JNI.Если вы просто делаете это в приложении, вы регистрируете его как любой другой код JNI (или его автозагрузку), но у меня нет подробностей об этом, так как я работаю со встроенным кодом большую часть времени.Как и в большинстве нативного кода, вам следует избегать коллизий имен символов, если вы встраиваете свой код в виртуальную машину, как текущий код.Мы стараемся сделать как можно большую часть кода статически ограниченной для файла, чтобы избежать таких проблем.Однако предоставление другой версии самого libssl.so - это совсем другое дело.Если вам нужно сделать что-то подобное, у меня нет ни одного протестированного устройства.

Этот документ может оказаться полезным и для фона, добавляющего новых провайдеров: Как реализовать провайдера в криптографии Java ™Архитектура http://download -llnw.oracle.com / javase / 6 / docs / technotes / guides / security / crypto / HowToImplAProvider.html

-бри

3 голосов
/ 03 августа 2010
% arm-eabi-objdump -p .../symbols/system/lib/libdvm.so
 ...
Dynamic Section:
  NEEDED               libnativehelper.so

% cat dalvik/libnativehelper/Android.mk
 ...
static_libraries := \
    libjavacore \
    libfdlibm

Он загружается автоматически как часть двоичного файла виртуальной машины.Нативные методы зарегистрированы явно - см. Dalvik / libnativehelper / Register.c.

Динамическая загрузка библиотеки работала бы для чего-то вроде реализации SSL, но проблематично для многих основных классов, потому что реализация необходимавыполнить загрузку общей библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...