网站界面设计案例,自己怎么设计网页,天元建设集团有限公司工程,东莞中小型网站建设Android Native Code开发学习#xff08;二#xff09;
本教程为native code学习笔记#xff0c;希望能够帮到有需要的人
我的电脑系统为ubuntu 22.04#xff0c;当然windows也是可以的#xff0c;区别不大
一、native code介绍
native code就是在android项目中混合C或…Android Native Code开发学习二
本教程为native code学习笔记希望能够帮到有需要的人
我的电脑系统为ubuntu 22.04当然windows也是可以的区别不大
一、native code介绍
native code就是在android项目中混合C或者C语言进行开发这样的好处是很多底层的东西需要使用C/C的语言进行操作而且在android开发中使用C和C混合开发能够大大增强逆向的难度同时还能提升程序运行的效率毕竟C/C的效率不是其他语言能比得上的。
二、NDK的开发流程
1.声明native方法
首先我们要先在你android的java文件中进行一个声明声明的格式是这种
public native String stringFromJNI();当然也可以加上参数
public native String stringFromJNI(String str);然后我们在android activity中调用这个函数
Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 我们调用这个方法并且使用TextView显示出来TextView tv binding.sampleText;tv.setText(stringFromJNI(我宣布个事));}2.实现这个方法
在生成的cpp文件中我们添加以下代码
#include jni.h
#include stringextern C JNIEXPORT jstring JNICALL
Java_com_example_nativecodelearn_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */, jstring str) {char* str_cpp (char *)env -GetStringUTFChars(str,NULL); // 我们首先要读取出来这个char* str_cpp_2 我是个大可爱;strcat(str_cpp,,); // 合并起来strcat(str_cpp,str_cpp_2);return env-NewStringUTF(str_cpp); // 格式需要转成UTF
}下面我们介绍一下上面出现的参数
**JNIEnv**这个鬼东西是一个指向JNI环境的指针可以通过它来访问JNI提供的接口方法
**jobject:**表示Java对象中的this
**JNIEXPORT,JNICALL:**这是JNI定义的宏。可以在jni.h中找到。
还有一个东西就是jstring这个代表的是java文件中的string类型就是在这种情况下我们我们是需要一一对应的比如用jint代表java中的int具体对比可以去查相关资料。
3.编译安装运行
这样我们就将程序拼接起来成功显示了我是个大可爱 三、JNI调用java方法
1.静态方法的调用
根据上文我们了解了如何进行java调用cpp的代码下面我们就介绍如何在cpp中调用java代码。
如果是静态的java代码cpp调用Java的基本步骤是先通过类名找到类再根据方法名找到方法的id最后就可以调用这个方法了。如果是非静态的那么需要构造出类的对象后才可以调用。
下面我们开始介绍静态方法的JNI调用
首先新建一个类并且创建一个静态的方法
public class JavaForJNI {public static String str_From_JNI(){System.out.println(java code running);return 全体目光向我看齐\n;}
}下面就是要在cpp文件中调用这个方法了
#include jni.h
#include stringextern C JNIEXPORT jstring JNICALL
Java_com_example_nativecodelearn_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */, jstring str) {char *str_cpp (char *) env-GetStringUTFChars(str, NULL); // 我们首先要读取出来这个char *str_cpp_2 我是个大可爱;jclass java_class env-FindClass(com/example/nativecodelearn/JavaForJNI);if (java_class NULL) {printf(Class not found);}jmethodID id env-GetStaticMethodID(java_class, str_From_JNI, ()Ljava/lang/String;);if (id NULL) {printf(MethodID not found);}jstring string_from_java (jstring) env-CallStaticObjectMethod(java_class, id);char* string_2(char *) env-GetStringUTFChars(string_from_java, NULL);printf(test in cpp);strcat(str_cpp, ,); // 合并起来strcat(str_cpp, str_cpp_2);strcat(string_2,str_cpp);return env-NewStringUTF(string_2); // 格式需要转成UTF
}
下面我们主要讲解一下cpp中的调用代码首先就是要获取这个类就是代码中
jclass java_class env - FindClass(com/example/nativecodelearn/JavaForJNI);这一段主要就是指定好运行的类名
jmethodID id env-GetStaticMethodID(java_class, str_From_JNI, ()Ljava/lang/String;);这一段主要是用来获取类中的方法名至于第三个参数是方法的签名这个其实不需要去了解一般android studio可以自动给你补全的。最后的话使用CallStaticObjectMethod调用不过要注意返回值至于返回值是一个类怎么处理我们下一节讲。
如果返回是空的话直接调用CallStaticVoidMethod就可以了 2.非静态方法的调用
非静态方法调用相对比较麻烦当然跟类有关的我们下一节再讲。
public String str_From_JNI_2(String string_from_cpp){return string_from_cpp\n谢谢各位\n;}调用方法为这次只贴部分代码
//查询类名
jclass clz env-FindClass(com/example/nativecodelearn/JavaForJNI);
//查询构造函数的id
jmethodID jcmid env-GetMethodID(clz, init, ()V);
//创建对象
jobject jobject env-NewObject(clz, jcmid);
//获取方法id
jmethodID jmeid env-GetMethodID(clz, str_From_JNI_2,(Ljava/lang/String;)Ljava/lang/String;);
//准备传入参数
jstring string_from_cpp env-NewStringUTF(string_2);
//调用方法
jstring final_string(jstring) env -CallObjectMethod(jobject,jmeid,string_from_cpp);这样我们就展示了互相传参与互相返回的使用方法与使用方式。希望这个博客可以帮到你。