当前位置: 首页 > news >正文

wordpress 360权重网络优化网络维护网络建站

wordpress 360权重,网络优化网络维护网络建站,南宁网站定制,公司手机版网站模板一、简介 关于NDK有两种方法注册#xff1a;静态注册和动态注册。 静态注册#xff1a; 就是直接在Java文件里写个native方法 然后再c/c文件中实现这个方法就行了#xff1b;动态注册#xff1a; 就是为了不要写很长的方法名#xff0c;用JNI_OnLoad方法实现预注册…一、简介 关于NDK有两种方法注册静态注册和动态注册。 静态注册 就是直接在Java文件里写个native方法 然后再c/c文件中实现这个方法就行了动态注册 就是为了不要写很长的方法名用JNI_OnLoad方法实现预注册即当执行System.LoadLibrary()方法时候就把需要调用的方法给注册了效率要高 Android就是采用此方法 下面就以示例来说明静态注册、动态注册以及C层调用Java层方法。 二、代码实现 GithubNDKDemo Java层Native方法定义 package com.cloudwise.ndk; import android.util.Log;public class NDKUtil {// 静态注册Native方法public native static String stringFromJNI();// 静态注册Native方法public native static void setJNILogEnable(int type);// 动态注册Native方法public native static int getVersionCode();// 动态注册Native方法public native static String getVersion(int code);// 动态注册Native方法并且C回调Java方法public native static void callJavaString();// 动态注册Native方法并且C回调Java方法public native static void callJavaVoid();// C调用Java方法带返回值public static String getStringToC(String name){Log.e(CLOUDWISE, name : name);return C From Java;}// C调用Java方法不带返回值public static void getVoidToC(int id, String name){Log.e(CLOUDWISE, id : id ---- name : name);} } C层代码 common.h #ifndef NDKDEMO_COMMON_H #define NDKDEMO_COMMON_H#ifdef __cplusplus extern C { #endif#define LOGOPEN 1 //日志开关1为开其它为关 #define LOG_TAG [CLOUDWISE-NDK] #if(LOGOPEN1)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #else #define LOGI(...) NULL#define LOGE(...) NULL#define LOGD(...) NULL #endif#ifdef __cplusplus } #endif#endif //NDKDEMO_COMMON_H native-lib.c #include jni.h #include string.h #include android/log.h #include pthread.h #include signal.h #include unistd.h #include stdlib.h #include common.hstatic JavaVM *j_vm NULL; static jclass j_class NULL;static jint debug 1;/*** 静态注册的Native方法* param env* param arg* return*/ JNIEXPORT jstring JNICALL Java_com_cloudwise_ndk_NDKUtil_stringFromJNI(JNIEnv *env,jclass arg) {jstring hello Hello ---- from ---- C;if(debug 1){LOGE(stringFromJNI ---- Hello ---- from ---- C);}return (*env)-NewStringUTF(env, hello); }/*** 静态注册的Native方法* param env* param arg* param type*/ JNIEXPORT void JNICALL Java_com_cloudwise_ndk_NDKUtil_setJNILogEnable(JNIEnv *env,jclass arg, jint type){if(type 1){debug 1;} else {debug 0;} }/*** 动态注册的Native方法* param env* param arg* return*/ JNIEXPORT jint JNICALL getVersionCode(JNIEnv *env, jclass arg){if(debug 1){LOGE(getVersionCode ----------- 10);}return 10; }/*** 动态注册的Native方法* param env* param arg* param code* return*/ JNIEXPORT jstring JNICALL getVersion(JNIEnv *env, jclass arg, jint code){if(debug 1){LOGE(getVersion ----------- 1.2.6);}jstring ver 1.2.6;return (*env)-NewStringUTF(env, ver); }/*** C调用Java方法带参数不带返回值*/ void callVoidFromJava(){JNIEnv *env;(*j_vm)-AttachCurrentThread(j_vm, env, NULL);jmethodID methodid (*env)-GetStaticMethodID(env, j_class, getVoidToC, (ILjava/lang/String;)V);(*env)-CallStaticVoidMethod(env, j_class, methodid, 10, (*env)-NewStringUTF(env, C-Name));if(debug 1) {LOGE(callVoidFromJava Java To C);} }/*** C调用Java方法带参数带返回值*/ void callStringFromJava(){JNIEnv *env;(*j_vm)-AttachCurrentThread(j_vm, env, NULL);jmethodID methodid (*env)-GetStaticMethodID(env, j_class, getStringToC, (Ljava/lang/String;)Ljava/lang/String;);jstring str (jstring)(*env)-CallStaticObjectMethod(env, j_class, methodid,(*env)-NewStringUTF(env, C-Name));char* java (char*)(*env)-GetStringUTFChars(env, str, NULL);if(debug 1) {LOGE(callStringFromJava Java To C : %s, java);} }/*** 动态注册的Native方法然后调用Java方法* param env* param arg*/ JNIEXPORT void JNICALL callJavaString(JNIEnv *env, jclass arg) {callStringFromJava(); }/*** 动态注册的Native方法然后调用Java方法* param env* param arg*/ JNIEXPORT void JNICALL callJavaVoid(JNIEnv *env, jclass arg) {callVoidFromJava(); }static JNINativeMethod mMethods[] {{getVersionCode, ()I, (void*)getVersionCode},{getVersion, (I)Ljava/lang/String;, (void*)getVersion},{callJavaString, ()V, (void*)callJavaString},{callJavaVoid, ()V, (void*)callJavaVoid} };static int registerNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods){jclass clazz;clazz (*env)-FindClass(env, className);if(clazz NULL){return -1;}j_class (jclass)(*env) - NewGlobalRef(env, (jobject)clazz);if((*env)-RegisterNatives(env, clazz, gMethods, numMethods) 0){return -1;}return 0; }static int registerNative(JNIEnv* env){return registerNativeMethods(env, com/cloudwise/ndk/NDKUtil, mMethods, sizeof(mMethods)/ sizeof(mMethods[0])); }JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){LOGE(JNI_OnLoad ------------------------------ );JNIEnv* env NULL;jint result -1;/** JavaVM::GetEnv 原型为 jint (*GetEnv)(JavaVM*, void**, jint);* GetEnv()函数返回的 Jni 环境对每个线程来说是不同的* 由于Dalvik虚拟机通常是Multi-threading的。每一个线程调用JNI_OnLoad()时* 所用的JNI Env是不同的因此我们必须在每次进入函数时都要通过vm-GetEnv重新获取*/if((*vm)-GetEnv(vm, (void**)env, JNI_VERSION_1_4) ! JNI_OK){return -1;}if(registerNative(env) ! JNI_OK){return -1;}j_vm vm;//cloudwise_init(1);result JNI_VERSION_1_4;return result; } Java层调用代码 package com.cloudwise.ndk;import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;import java.io.InputStream;public class CrashActivity extends AppCompatActivity implements View.OnClickListener {TextView txt;Button btn, btn_debug, btn_close, btn_ver_code, btn_ver, btn_logcat;// Used to load the native-lib library on application startup.static {System.loadLibrary(native-lib);}Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_crash);// Example of a call to a native methodtxt (TextView) findViewById(R.id.sample_text);btn (Button)findViewById(R.id.btn);btn.setOnClickListener(this);btn_debug (Button)findViewById(R.id.btn_debug);btn_debug.setOnClickListener(this);btn_close (Button)findViewById(R.id.btn_close);btn_close.setOnClickListener(this);btn_ver (Button)findViewById(R.id.btn_ver);btn_ver.setOnClickListener(this);btn_ver_code (Button)findViewById(R.id.btn_ver_code);btn_ver_code.setOnClickListener(this);btn_logcat (Button)findViewById(R.id.btn_string);btn_logcat.setOnClickListener(this);btn (Button)findViewById(R.id.btn_void);btn.setOnClickListener(this);}private void btnClick(){txt.setText(NDKUtil.stringFromJNI());//Log.e(CLOUDWISE, stringFromJNI-------);}private void btnDebug(){NDKUtil.setJNILogEnable(1);}private void btnClose(){NDKUtil.setJNILogEnable(0);}private void btnVer(){txt.setText(NDKUtil.getVersion(1));}private void btnVerCode(){txt.setText(NDKUtil.getVersionCode());}private void btnString(){NDKUtil.callJavaString();}private void btnVoid(){NDKUtil.callJavaVoid();}Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn:btnClick();break;case R.id.btn_debug:btnDebug();break;case R.id.btn_close:btnClose();break;case R.id.btn_ver:btnVer();break;case R.id.btn_ver_code:btnVerCode();break;case R.id.btn_string:btnString();break;case R.id.btn_void:btnVoid();break;}} }Java层布局代码 ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalScrollViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalTextViewandroid:idid/sample_textandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_margin10dpandroid:text /Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:textJNI调用android:idid/btnandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:textVersionCodeandroid:idid/btn_ver_codeandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:textVersionandroid:idid/btn_verandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:text开启JNI日志android:idid/btn_debugandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:text关闭JNI日志android:idid/btn_closeandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:textC调Java(带返回值)android:idid/btn_stringandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp/Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:textC调Java(不带返回值)android:idid/btn_voidandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dp//LinearLayout/ScrollView/LinearLayout布局界面 运行结果 [CLOUDWISE-NDK]: stringFromJNI ---- Hello ---- from ---- C [CLOUDWISE-NDK]: getVersionCode ----------- 10 [CLOUDWISE-NDK]: getVersion ----------- 1.2.6 CLOUDWISE: name : C-Name [CLOUDWISE-NDK]: callStringFromJava Java To C : C From Java CLOUDWISE: id : 10 ---- name : C-Name [CLOUDWISE-NDK]: callVoidFromJava Java To C
http://www.yutouwan.com/news/67185/

相关文章:

  • 游戏网站制作苏州姑苏区建设局网站
  • 延安网站制作网站后台管理系统登陆
  • 抚州城乡建设厅网站黄山公司做网站
  • 外贸云网站建设临沂免费自助建站模板
  • 做网站卖东西赚钱吗网页首站
  • 网站建设制作一个网站的费用软件网站开发
  • 学校网站的英文手机网站有什么
  • 梦幻创意晋城网站建设杭州发布最新消息
  • 美文的手机网站企业邮箱可以是个人qq邮箱吗
  • 文本资料分享网站 建设什么网站上做推广
  • 注册网站可以注销嘛网站子站建设
  • 做旅游景区网站东莞市网络公司
  • 网站一级域名申请优化师的工作内容
  • 东莞app培训网站建设查询建设公司业绩网站
  • 公司网站域名主机dw网页设计代码模板源代码
  • 在线视频教学网站建设360优化大师历史版本
  • 山东省建设厅教育网站wordpress登陆post
  • 英语教学网站建设意见旅游手机网站开发
  • 网站有必要使用伪静态么公司里面有人员增减要去哪个网站做登记
  • 网站空间购买哪个好河北伟创网络技术有限公司
  • 建app网站要多少钱泰安市房产交易中心官网
  • 网站建设公司用5g软件开发工程师的薪资待遇
  • 大学生做兼职的网站有哪些网站后台管理代码
  • 手机网站发布页电脑版网上商城程序
  • 如何在个人电脑用源码做网站六盘水南宁网站建设
  • 网站微信付款调用建设网站应该加什么服务器
  • 做网站需要买域名吗wordpress多站点无法访问
  • 织梦网站地图制作教程哪里可以学ps软件网课
  • 宜兴市网站建设泉州网站建设方案服务
  • 玉树网站建设公司精美个人网站