Lors de la création d'applications nécessitant l'échange de données entre le code C et Java, la technologie JNI (Java Native Interface) est souvent utilisée. Voici un guide simplifié pour faciliter cette intégration.
Configuration sous Windows
Pour compiler une DLL sous Visual Studio, il faut inclure les fichiers d'en-tête Java. Pour ce faire, ajoutez le chemin d'inclusion de Java dans les propriétés du projet. Évitez également l'utilisation des en-têtes précompilés pour garantir la compatibilité avec Linux.
Au moment de la compilation, assurez-vous de générer la version Releace pour distribuer votre DLL, car la version Debug pourrait ne pas fonctionner sur des machines sans l'enviornnement de développement Visual C++.
class SmsHandler {
public native int initSms();
public native int sendSms(byte[] phoneNumber, byte[] message);
public native int readSms(int x, double[] content);
}
Les fichiers h générés par javac -h . SmsHandler.java doivent être utilisés pour développer les fonctions natives comme suit :
#include <jni.h>
typedef struct SmsData {
int id;
double content[40];
} SmsEntry;
JNIEXPORT jint JNICALL Java_SmsHandler_initSms(JNIEnv* env, jobject obj) {
return InitSms();
}
JNIEXPORT jint JNICALL Java_SmsHandler_sendSms(JNIEnv* env, jobject obj, jbyteArray phone, jbyteArray msg) {
char *msgContent = (char *)(*env)->GetByteArrayElements(env,msg,0);
char *phoneNum = (char *)(*env)->GetByteArrayElements(env,phone,0);
return SendSms(phoneNum, msgContent);
}
JNIEXPORT jint JNICALL Java_SmsHandler_readSms(JNIEnv* env, jobject obj, jint x, jdoubleArray data) {
SmsEntry entry;
jdouble *dataPtr = (*env)->GetDoubleArrayElements(env,data,0);
for(int i = 0; i < 2; ++i) {
entry.content[i] = dataPtr[i];
}
return ReadSms(x, &entry);
}
Configuration sous Linux
Pour compiler une bibliothèque partagée (.so), vous devez nommer le fichier avec le préfixe "lib". Assurez-vous également que JAVA_HOME est correctement configuré pour utiliser la version appropriée de Java.
mkdir -p /usr/local/java
cd /usr/local/java
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar -zxvf jdk-17_linux-x64_bin.tar.gz
echo 'export JAVA_HOME=/usr/local/java/jdk-17' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Pour exécuter votre programme Java, utilisez la commande suivante pour indiquer où se trouve la bibliothèque native :
java -Djava.library.path=. SmsHandler
Ces étapes pemrettent d'établir une communication efficace entre le code C et Java via JNI.