您现在的位置是:主页 > news > 网上代做论文的网站/百度产品优化排名软件

网上代做论文的网站/百度产品优化排名软件

admin2025/4/19 17:56:31news

简介网上代做论文的网站,百度产品优化排名软件,深圳工业设计师工资一般多少,大连网站建设辽icp备文章目录JNI调用java函数在app端创建回调方法在so代码中调用回调番外 JNI java string到c/c相关总结JNI调用java函数 Android JNI回调的三种方法 以下以静态方法为例 在app端创建回调方法 同上个例子 在com.example.helloso.MainActivity中 创建一个静态回调函数 public st…

网上代做论文的网站,百度产品优化排名软件,深圳工业设计师工资一般多少,大连网站建设辽icp备文章目录JNI调用java函数在app端创建回调方法在so代码中调用回调番外 JNI java string到c/c相关总结JNI调用java函数 Android JNI回调的三种方法 以下以静态方法为例 在app端创建回调方法 同上个例子 在com.example.helloso.MainActivity中 创建一个静态回调函数 public st…

文章目录

  • JNI调用java函数
    • 在app端创建回调方法
    • 在so代码中调用回调
  • 番外 JNI java string到c/c++相关
  • 总结

JNI调用java函数

Android JNI回调的三种方法

以下以静态方法为例

在app端创建回调方法

同上个例子 在com.example.helloso.MainActivity中
创建一个静态回调函数

  public static void Callback_GetString(){Toast.makeText(mContext,"Callback_GetString",Toast.LENGTH_SHORT);Log.i(TAG,"Callback_GetString");}

在so代码中调用回调

在c++函数中调用回调函数

//该函数同上一节对应java native函数 com.example.helloso.MainActivity中HelloWorld()
jstring Java_com_example_helloso_MainActivity_HelloWorld(JNIEnv* env, jobject thiz) {LOGE("Start HelloWorld");Callback_TestVoid();LOGE("End HelloWorld");return env->NewStringUTF("Java_com_example_helloso_MainActivity_HelloWorld");
}

重写JNI_Onload函数 在载入时加载确定jni回调函数的ID

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {LOGI("Start JNI_OnLoad");JNIEnv* env;g_pJavaVM = vm;if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) {return JNI_ERR; // JNI version not supported.}jclass  clz = env->FindClass("com/example/helloso/Callback");g_jniHelperClz = (jclass)env->NewGlobalRef(clz);jmethodID  jniHelperCtor = env->GetMethodID(g_jniHelperClz,"<init>", "()V");jobject    handler = env->NewObject(g_jniHelperClz,jniHelperCtor);g_jniHelperObj = env->NewGlobalRef(handler);/g_methodTestVoid = env->GetStaticMethodID(g_jniHelperClz,"Callback_TestVoid", "()V");g_methodTestString = env->GetStaticMethodID(g_jniHelperClz,"Callback_TestString", "(Ljava/lang/String;)Ljava/lang/String;");g_methodTestByteArray = env->GetStaticMethodID(g_jniHelperClz,"Callback_TestByteArray", "([BI)[B");///g_mainActivityObj = NULL;LOGI("End JNI_OnLoad");return  JNI_VERSION_1_6;
}

回调函数调用,先获得env,再通过全局jmethodID 调用java函数

void Callback_TestVoid() {LOGE("Start Callback_TestVoid");JNIEnv *env;jint res = g_pJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);if (g_methodTestVoid != NULL) {LOGE("Start CallStaticVoidMethod");env->CallStaticVoidMethod(g_jniHelperClz, g_methodTestVoid);}LOGE("End Callback_TestVoid");
}

解释GetMethodID 获得函数地址

jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);//获得函数地址
jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig);//获得静态函数地址

sig表示标识函数格式

sig参数示意:  
boolean:Z
byte:B
char:C
short:S
int:I
long:J
float:F
double:D
void:V
[数组]:[+类型
Object对象:L包名/类名; 或包名/类名$标识嵌套类;
例子(方法 ->- 对应的sig):  
void M1(int A,int B) ->- “(II)V”
void M2(String S) ->- “(Ljava/lang/String;)V”  
void M3(int[] I) ->- “([I)V”  
String M4(String S) ->-"(Ljava/lang/String;)Ljava/lang/String"  
long M5(int I,Class class) ->- “(ILjava/lang/Class;)J”  
void M6(long LONG) ->- “(J)V”

番外 JNI java string到c/c++相关

JAVA和C++通过JNI传递中文乱码问题的解决方案
Android Native 开发之 NewString 与 NewStringUtf 解析
Android jni/ndk编程二:jni数据类型转换(primitive,String,array)
jni直接转byte_JNI jbyteArray转char*

       String (UTF-16)|
[java]    |
--------------------  JNI 调用
[cpp]     |vjstring (UTF-16)|   +--------------------------+---------------------------+|GetStringChars/NewString  |GetStringUTFChars/NewStringUTF|                                                 |v                                                 v
wchar_t*                                         char*
(UTF_16)                                        (UTF-8)

总结

demo地址