C++ Android 通过JNI 双向调用注意事项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ Android 通过JNI 双向调用注意事项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4611字,纯文字阅读大概需要7分钟。
内容图文
![C++ Android 通过JNI 双向调用注意事项](/upload/InfoBanner/zyjiaocheng/852/89e9e4eaa92d4fb2b9318850633f61dd.jpg)
在一般的APP项目中,都不用用到C++ 所以当我们需要使用C++(也就是JNI)的时候 需要在 Android studio 中进行如下设置
(这里需要特别注意下 如果你的 Android studio版本是3.0及以上时,那么原来3.0以下的版本 在运行项目时会提示 “No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi”
我的解决方法是 在3.0以下的版本点击安装 CMAKE,NDK,3.0以上的项目也没有报错)
方法有两种:
(1)File --> Settings --> Appearance & Behavior --> System Settings --> Android SDK -->勾选CMAKE,NDK
(2)ctrl+alt+S -->搜索框中 输入 SDK -->勾选CMAKE,NDK
如下图:
配置做完后 在撸代码之前 我们来对 java类型与C++类型的比较
/* * * Java类型 别名 C++本地类型 字节(bit) boolean jboolean unsigned char 8, unsigned byte jbyte signed char 8 char jchar unsigned short 16, unsigned short jshort short 16 int jint long 32 long jlong __int64 64 float jfloat float 32 double jdouble double 64 void void n/a * * */
开始正式撸代码 (如果大家想快速生成JNI范例 在新建项目时勾选 include C++ 就可以)
MainActivity.java
public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib");//此.so名称名称可以在 CMakeLists.txt 中修改 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI()); tv.setText(testNativeFunction()); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native String stringFromJNI(); public native String testNativeFunction(); /* * java调用有参方法 */ public static Object cByJava(int b){ Log.i("cByJava", "cByJava: 我被调用了 b:"+b); return "ssssss"; } public static void cByJavaf(){ Log.i("cByJava1", "cByJava: 我被调用了 "); } }
native-lib.cpp
#include <jni.h> #include <string> #define NativeStr(name)Java_com_example_android_testc_##name /* * * 类型 相应的签名:(就是后面的 GetStaticMethodID(mMain,"cByJava","(I)Ljava/lang/Object;") 的 (I)Ljava/lang/Object;) boolean Z byte B char C short S int I long J float F double D void V object L用/分隔包的完整类名: Ljava/lang/String; Array [签名 [I [Ljava/lang/Object; Method (参数1类型签名 参数2类型签名···)返回值类型签名 * * */ extern "C" JNIEXPORT jstring JNICALL NativeStr(MainActivity_stringFromJNI)( JNIEnv *env, jobject /* this */) { //C++调用java 带参数 有返回值(当返回值为String时用Object代替) //----------------beigin---------------- // static const char* const DL_CLASS_NAME = "com/example/android/testc/MainActivity"; // jclass mMain = (env)->FindClass(DL_CLASS_NAME); // jmethodID cByJava =(env)->GetStaticMethodID(mMain,"cByJava","(I)Ljava/lang/Object;");//java中有参数返回的方法的时候;一定要加上 ";" 不然会调用失败 // jstring result =(jstring)(env)->CallStaticObjectMethod(mMain, cByJava,1111); //----------------end---------------- // return result; // std::string hello = ""; // return env->NewStringUTF(hello.c_str()); //C++调用java 带参数 无返回值 static const char* const DL_CLASS_NAME = "com/example/android/testc/MainActivity"; jclass mMain = (env)->FindClass(DL_CLASS_NAME); jmethodID cByJavaf =(env)->GetStaticMethodID(mMain,"cByJavaf","()V");//在方法名为void的情况下 V后面不能加上 ';' 不然会运行异常 报找不到方法 ()后面一定要大写 (env)->CallStaticVoidMethod(mMain, cByJavaf); jstring js =env->NewStringUTF("ssssssss"); return js; }
extern "C" JNIEXPORT jstring JNICALL NativeStr(MainActivity_testNativeFunction)( JNIEnv *env, jobject /* this */) { static const char* const DL_CLASS_NAME = "com/example/android/testc/MainActivity"; jclass mMain = (env)->FindClass(DL_CLASS_NAME); jmethodID cByJavaf =(env)->GetStaticMethodID(mMain,"cByJavaf","()V");//在方法名为void的情况下 V后面不能加上 ';' 不然会运行异常 报找不到方法 ()后面一定要大写 (env)->CallStaticVoidMethod(mMain, cByJavaf); jstring js =env->NewStringUTF("sssffffsssss"); return js; }
此处有个坑: 在studio3.2 中 每个C++方法都需要加上 extern "C" JNIEXPORT 前缀 不然会提示找不到 第二个方法 NativeStr(MainActivity_testNativeFunction)
打完收工
}
内容总结
以上是互联网集市为您收集整理的C++ Android 通过JNI 双向调用注意事项全部内容,希望文章能够帮你解决C++ Android 通过JNI 双向调用注意事项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。