Создайте папку JNI в корневой папке приложения Android (там, где есть src, res). Поместите код (1), назовите его как someshared-lib.c.
(1)
Java_YourPackageName_YourClassNameWhereYoudeclareYourNativeFunction_NativeFuntionName(JNIEnv* env,jobject thiz)
{
//your c code , the JNI will act as a wrapper for it
return (*env)->NewStringUTF(env, "<string to pass or you can mention jchar * type string >");
}
(2) В файле Java
package YourPackageName;
public class YourClassNameWhereYoudeclareYourNativeFunction extends Activity
{
public native String NativeFuntionName();
String returnValue = NativeFuntionName();
}
(3) В Android.mk сделайте следующее:
LOCAL_PATH: = $ (позвоните в мою директорию)
включает $ (CLEAR_VARS)
LOCAL_MODULE: = someshared-lib // обратите внимание на имя lib, совпадающее с именем файла c
LOCAL_SRC_FILES: = someshared-lib.c // это файл, в который вы поместили код (1)
включает $ (BUILD_SHARED_LIBRARY)
экспорт вашей ndk-сборки
(сделать экспорт PATH =: $ PATH
перейдите в папку JNI, как создано выше:
выполнить команду ndk-build
вы получите библиотеку, сформированную someshared-lib в папке lib, сформированной в корневой папке Application. будет установлен в устройстве. Чтобы проверить это, вы можете перейти на
/ data / data / your_package_name / lib.
Приложение ищет эту библиотеку в папке / data / data / your_package_name / lib (также / system / lib) и использует ее для динамических вызовов (JNI), выполняемых из приложения Android.
Теперь, если вы хотите вернуть что-то кроме строки, вы должны изменить указанную выше методику в файле c, как показано ниже:
Java_YourPackageName_YourClassNameWhereYoudeclareYourNativeFunction_NativeFuntionName(JNIEnv* env,jclass obj,jobject thiz)
{
jfieldID fid;
jboolean enable_flag;
//Pass the class object having all the variable from the android app to the JNI in the jclass obj and access its members using the field ID and using Get and Set firld ID.
clazz = (*env)->GetObjectClass(env, info);
fid = (*env)->GetFieldID(env,clazz,"some_variable","X"); //"X" - type of variable for boolean it //is Z , for INtezer it is I, for double it is D,
см. Этот документ для подробного объяснения
//for getting teh value fomr the JNI
enable_flag = (*env)->GetBooleanField(env, **thiz**, fid);
//for setting the value
fid = (*env)->GetFieldID(env,clazz,"other_float_variable","D");
(*env)->SetDoubleField(env,**thiz**,fid,other_float_variable);
}
Также в приложении Android вы должны передать объект Class структуры.
например,
(2) станет теперь:
пакет YourPackageName;
public class YourClassNameWhereYoudeclareYourNativeFunction extends Activity
{
public native String NativeFuntionName();
String returnValue = NativeFuntionName( exampleStruct exst);
где exampleStruct:
открытый класс exampleStruct {
protected boolean some_variable = 0;//no log saving by default
protected float other_float_variable = 0;
}
}
Надеюсь, это поможет.