Android 中Java 和C/C++的相互调用方法

AndroidStudio jni C++与Java互相调用 jni C++与Java互相调用 阅读详情

  在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用。

       Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在 Java 虚拟机 (VM)内部运行的 Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。

       由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会去载入C组件,然后让Java的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。

       在实际应用中这两者之间的调用关系可以归纳为以下四种方式:

             1.       在应用的JAVA代码中调用NDK中C/C++实现的函数。

             2.       在NDK开发中的C/C++代码调用应用中JAVA类的静态函数。

             3.       在NDK开发中的C/C++代码调用应用中JAVA类当前传入NDK中的实例的函数。

            4.       在NDK开发中的C/C++代码调用应用中JAVA类新建实例的函数。

 

下面我们就怎样在Eclipse中实现JNI编码和四种调用方式加以阐述。

 

一、在Eclipse中建立一个包含JNI开发的工程。

在这里我们不直接导入NDK中的hello-jni来说明JNI的使用方法。而是新建立一个工程,来说明怎样建立一个包含JNI的工程。

第一步:建立一个Andriod工程JniDemo,在该工程的根目录下建立一个叫jni的目录,在jni目录下建立一个叫Android.mk的文件,(当然你也可以从其他地方,比如ndk样例代码hello-jni中将里面的Android.mk复制过来修改)。 Android.mk里面的内容如下所示

LOCAL_PATH :=$(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE   := demo-jni

LOCAL_SRC_FILES := demo-jni.c

include$(BUILD_SHARED_LIBRARY)

关于这几句话的含义,在这里不再赘述。网上搜下,就可以很明白。

然后在jni目录下生成demo-jni.c文件。实现的接口的内容。

现在选中工程中的jni目录,点击鼠标右键,选Refresh,jni目录中的文件就显示在工程的jni目录下了。

第二步:设置jni的编译环境。选中工程中的根目录JniDemo,点击鼠标右键,选Properties。弹出对话框,选中列表中的Builders。如图一所示:

图一:JniDemo特性设置对话框

点击对话框右端的new按钮,弹出“Choose configuration type”对话框,如图二,选择Program,点击对话框下面的OK按钮。

图二:选择配置类型

现在我们打开了”Edit Configuration”对话框,在Name对应的文本框中输入名字JniBuilder(当然也可是你喜欢的其他名字).在Main选项下,在Location中输入cygwin系统中bash.exe的绝对路径。我这里是c:\cygwin\bin\bash.exe(c:\cygwin\为我的系统中cygwin的安装目录,这里要根据你的电脑中cygwin的安装目录来确定),在Working Directory中输入c:\cygwin\bin\.在Arguments中输入--login -c "cd /cygdrive/d/study/JniDemo && /cygdrive/d/android-ndk-r6b/ndk-build"。这里/cygdrive/d/study/JniDemo为工程根目录, /cygdrive/d/android-ndk-r6b为NDK的安装目录。这两个目录参数根据你的工程目录和ndk的安装目录而定。注意的是驱动器要采用cygwin的方式。(比如:Windows系统下的D:对应/cygdrive/d,其余类推)。设置结果如图三所示,然后点击 OK按钮即可。

图三:编辑JNI配置参数

 

二、演示四种调用方式

演示界面如图四所示,四个按钮分别测试四种调用方式。

图四:演示界面图

分别点击按钮Test1, Test2, Tes3, Test四的测试结果如图五、六、七、八所示。

图五:点击Test1的测试结果

图六:点击Test2的测试结果

图七:点击Test3的测试结果

 

图八:点击Test4的测试结果

 

Test1演示在应用中调用NDK中C/C++实现的函数。JAVA代码和C代码分别为:

JAVA 代码:

[java]  view plain  copy
  1. Button btn01 = (Button)findViewById(R.id.Button01);  
  2. btn01.setOnClickListener(new Button.OnClickListener()  
  3. {  
  4.     publicvoid onClick(View v)  
  5.     {        
  6.         TextView tv = (TextView)findViewById(R.id.tv01);  
  7.         tv.setText(stringFromJNI());              
  8.   
  9.         showMessage(JniDemoActivity.this,"JNI test1", stringFromJNI());  
  10.     }  
  11. });  

C代码:

[cpp]  view plain  copy
  1. Jstring Java_study_jnidemo_JniDemoActivity_stringFromJNI( JNIEnv* env,jobject thiz )  
  2.   
  3. {  
  4.     return (*env)->NewStringUTF(env,"JniDemo, Hello from JNI!");  
  5. }  


l         Test2 静态调用。JAVA代码和C代码分别为:

JAVA 代码:

[java]  view plain  copy
  1. // 测试C/C++中对JAVA函数的静态回调  
  2. Button btn02 = (Button)findViewById(R.id.Button02);  
  3. btn02.setOnClickListener(new Button.OnClickListener()  
  4. {  
  5.     publicvoid onClick(View v)  
  6.     {  
  7.         int ret =jniStaticShowMessage(JniDemoActivity.this,"JNI test2","test static callback Message");  
  8.         TextView tv = (TextView)findViewById(R.id.tv01);  
  9.         if(ret == 0)  
  10.         {  
  11.            tv.setText("test JNI static callback successed");  
  12.         }  
  13.         else  
  14.         {  
  15.            tv.setText("test JNI static callback fialed");  
  16.         }  
  17.     }  
  18. });  


C代码:

[cpp]  view plain  copy
  1. Jint Java_study_jnidemo_JniDemoActivity_jniStaticShowMessage(JNIEnv* env,   
[cpp]  view plain  copy
  1.                         jobject thiz,jobject ctx, jstring strTitle, jstring strMessage)  
  2. {  
  3.     jclass cls = (*env)->FindClass(env, "study/jnidemo/JniDemoActivity");  
  4. //  jclass cls = (*env)->GetObjectClass(env, thiz);  
  5.     if(cls != NULL)  
  6.     {  
  7.        jmethodID id = (*env)->GetStaticMethodID(env, cls,"staticShowMessage",  
  8.             "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");  
  9.        if(id != NULL)  
  10.        {  
  11.       return (*env)->CallStaticIntMethod(env, cls, id, ctx, strTitle, strMessage);  
  12.        }  
  13.     }  
  14.     return 1;  
  15. }  


l         Test3 当前实例调用:JAVA代码和C代码分别为:

JAVA 代码:

[java]  view plain  copy
  1. Button btn03 = (Button)findViewById(R.id.Button03);  
  2. btn03.setOnClickListener(new Button.OnClickListener()  
  3. {  
  4.     publicvoid onClick(View v)  
  5.     {  
  6.         strTest = " [message has changed now]";  
  7.         int ret = jniShowMessage(JniDemoActivity.this,"JNI test3","test callback in current instance");  
  8.         TextView tv = (TextView)findViewById(R.id.tv01);              
  9.   
  10.         if(ret == 0)  
  11.         {  
  12.            tv.setText("test JNI callback successed");                        
  13.         }  
  14.         else  
  15.         {  
  16.            tv.setText("test JNI callback fialed");  
  17.         }  
  18.     }  
  19. });  

C代码:

[cpp]  view plain  copy
  1. Jint Java_study_jnidemo_JniDemoActivity_jniShowMessage(JNIEnv* env, jobject thiz,  
  2.        jobject ctx, jstring strTitle, jstring strMessage)  
  3.   
  4. {  
  5.     jclass cls = (*env)->GetObjectClass(env, thiz);  
  6.     if(cls != NULL)  
  7.     {  
  8.        jstring str;  
  9.        jmethodID strTest_id = (*env)->GetMethodID(env, cls, "getTestString","()Ljava/lang/String;");  
  10.   
  11.        if(strTest_id != NULL)  
  12.   
  13.        {  
  14.           str = (*env)->CallObjectMethod(env, thiz, strTest_id);  
  15.        }   
  16.   
  17.        jmethodID showMessage_id = (*env)->GetMethodID(env, cls, "showMessage",  
  18.     "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");   
  19.   
  20.        if(showMessage_id != NULL)  
  21.        {  
  22.           return (*env)->CallIntMethod(env, thiz, showMessage_id, ctx,  
  23.                  strTitle, combine_jstring(env, strMessage, str));  
  24.        }  
  25.     }  
  26.     return 1;  
  27. }  


l         Test4新建实例调用:JAVA代码和C代码分别为:

JAVA 代码:

[java]  view plain  copy
  1. Button btn04 = (Button)findViewById(R.id.Button04);  
  2. btn04.setOnClickListener(newButton.OnClickListener()  
  3. {  
  4.     publicvoid onClick(View v)  
  5.     {  
  6.         strTest = " [message has changed now]";  
  7.         int ret = jniInstanceShowMessage(JniDemoActivity.this,  
  8. JNI test4","test callback in new instance");  
  9.         TextView tv = (TextView)findViewById(R.id.tv01);              
  10.   
  11.         if(ret == 0)  
  12.         {  
  13.            tv.setText("test JNI new instance successed");        
  14.         }  
  15.        else  
  16.         {  
  17.            tv.setText("test JNI new instance fialed");  
  18.         }  
  19.     }  
  20. });  


C代码:

[cpp]  view plain  copy
  1. jint Java_study_jnidemo_JniDemoActivity_jniInstanceShowMessage(JNIEnv* env, jobject thiz,  
  2.        jobject ctx, jstring strTitle, jstring strMessage)  
  3. {  
  4.     jclass cls = (*env)->FindClass(env, "study/jnidemo/JniDemoActivity");  
  5.     if(cls != NULL)  
  6.     {  
  7.        // get instance  
  8.        jmethodID constuctor_id = (*env)->GetMethodID(env, cls, "<init>", "()V");  
  9.        if(constuctor_id != NULL)  
  10.        {  
  11.           jobject obj = (*env)->NewObject(env, cls, constuctor_id);  
  12.           if(obj != NULL)  
  13.           {  
  14.              jstring str;  
  15.              jmethodID strTest_id = (*env)->GetMethodID(env, cls, "getTestString","()Ljava/lang/String;");  
  16.              if(strTest_id != NULL)  
  17.              {  
  18.                  str = (*env)->CallObjectMethod(env, obj, strTest_id);  
  19.              }  
  20.              jmethodID showMessage_id = (*env)->GetMethodID(env, cls,"showMessage",  
  21.                     "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");  
  22.              if(showMessage_id != NULL)  
  23.              {  
  24.                  return (*env)->CallIntMethod(env, obj, showMessage_id, ctx,strTitle, combine_jstring(env, strMessage, str));  
  25.              }  
  26.           }  
  27.        }  
  28.     }  
  29.     return 1;  
  30. }  


Test1 和Test2都是常规的调用,在这里不做解释了。现在我们看看Test3和Test4的区别,在Test3中,strTest = " [message has changed now]" 在相应的代码中都做了赋值。但是在Test4中并没有改变,还是初始值。这是因为Test创建了一个新实例,和应用的JAVA代码中所赋值的实例并不是同一个。因此才出现了不同的结果。

 

附完整的JAVA和C代码

JAVAD代码: JniDemoActivity.java

[java]  view plain  copy
  1. package study.jnidemo;   
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.os.Bundle;  
  6. import android.widget.Button;  
  7. import android.view.View;  
  8. import android.widget.TextView;  
  9. import android.content.Context;  
  10. import android.content.DialogInterface;   
  11.   
  12. publicclass JniDemoActivityextends Activity {      
  13.   
  14.     public StringstrTest =" [initial message]";             
  15.   
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     publicvoid onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);         
  21.   
  22.         findAndModifyButton();  
  23.     }  
  24.   
  25.     public String getTestString()  
  26.     {  
  27.         returnstrTest;  
  28.     }     
  29.   
  30.     // 测试JAVA的NDK调用  
  31.     publicnative String stringFromJNI();      
  32.   
  33.     // 测试C/C++中对JAVA函数的静态回调  
  34.     publicnativestaticint jniStaticShowMessage(Context ctx, String strTitle, String strMessage);      
  35.   
  36.     // 测试实例中C/C++中对JAVA类的函数的调用  
  37.     publicnativeint jniShowMessage(Context ctx, String strTitle, String strMessage);      
  38.   
  39.     // 测试创建新实例C/C++对JAVA类的函数的调用  
  40.     publicnativeint jniInstanceShowMessage(Context ctx, String strTitle, String strMessage);      
  41.   
  42.     static {  
  43.         System.loadLibrary("demo-jni");  
  44.     }      
  45.   
  46.     staticint staticShowMessage(Context ctx, String strTitle, String strMessage)  
  47.     {     
  48.         AlertDialog.Builder builder = new AlertDialog.Builder(ctx);     
  49.         builder.setTitle(strTitle);  
  50.         builder.setMessage(strMessage);  
  51.         builder.setPositiveButton("确定",  
  52.          new DialogInterface.OnClickListener(){  
  53.   
  54.                public void onClick(DialogInterface dialog,int whichButton){               
  55.   
  56.                }  
  57.         });  
  58.         builder.show();      
  59.         return 0;  
  60.   
  61.     }     
  62.   
  63.     publicint showMessage(Context ctx, String strTitle, String strMessage)  
  64.     {  
  65.         returnstaticShowMessage(ctx, strTitle, strMessage);  
  66.     }         
  67.   
  68.     privatevoid findAndModifyButton()  
  69.     {  
  70.         // 测试JAVA的NDK调用  
  71.         Button btn01 = (Button)findViewById(R.id.Button01);  
  72.         btn01.setOnClickListener(new Button.OnClickListener()  
  73.         {  
  74.                 publicvoid onClick(View v)  
  75.              {        
  76.                 TextView tv = (TextView)findViewById(R.id.tv01);  
  77.                 tv.setText(stringFromJNI());              
  78.   
  79.                 showMessage(JniDemoActivity.this,"JNI test1", stringFromJNI());  
  80.             }  
  81.         });  
  82.   
  83.       
  84.   
  85.         // 测试C/C++中对JAVA函数的静态回调  
  86.         Button btn02 = (Button)findViewById(R.id.Button02);  
  87.         btn02.setOnClickListener(new Button.OnClickListener()  
  88.         {  
  89.   
  90.                 publicvoid onClick(View v)  
  91.              {  
  92.                 int ret =jniStaticShowMessage(JniDemoActivity.this,"JNI test2", "test static callback Message");  
  93.                 TextView tv = (TextView)findViewById(R.id.tv01);  
  94.   
  95.                   if(ret == 0)  
  96.                 {  
  97.                     tv.setText("test JNI static callback successed");                        
  98.                 }  
  99.                 else  
  100.                 {  
  101.   
  102.                     tv.setText("test JNI static callback fialed");  
  103.                 }  
  104.                 }  
  105.   
  106.     });  
  107.    
  108.   
  109.     // 测试实例中C/C++中对JAVA类的函数的调用  
  110.     Button btn03 = (Button)findViewById(R.id.Button03);  
  111.     btn03.setOnClickListener(new Button.OnClickListener()  
  112.     {  
  113.         publicvoid onClick(View v)  
  114.         {  
  115.             strTest = " [message has changed now]";  
  116.             int ret = jniShowMessage(JniDemoActivity.this,"JNI test3", "test callback in current instance");  
  117.             TextView tv = (TextView)findViewById(R.id.tv01);              
  118.   
  119.            if(ret == 0)  
  120.             {  
  121.                tv.setText("test JNI callback successed");                        
  122.             }  
  123.             else  
  124.             {  
  125.                tv.setText("test JNI callback fialed");  
  126.             }  
  127.         }  
  128.     });  
  129.   
  130.       
  131.     // 测试创建新实例C/C++对JAVA类的函数的调用  
  132.     Button btn04 = (Button)findViewById(R.id.Button04);  
  133.     btn04.setOnClickListener(new Button.OnClickListener()  
  134.     {  
  135.         publicvoid onClick(View v)  
  136.         {  
  137.             strTest = " [message has changed now]";  
  138.             int ret = jniInstanceShowMessage(JniDemoActivity.this,"JNI test4", "test callback in new instance");  
  139.             TextView tv = (TextView)findViewById(R.id.tv01);              
  140.   
  141.             if(ret == 0)  
  142.             {  
  143.                tv.setText("test JNI new instance successed");                           
  144.             }  
  145.             else  
  146.             {  
  147.                tv.setText("test JNI new instance fialed");  
  148.             }  
  149.         }  
  150.     });  
  151.     }    
  152.   
  153. }  


 

C代码 demo-jni.cpp

[cpp]  view plain  copy
  1. #include<string.h>  
  2. #include<jni.h>  
  3.   
  4. // 加载此动态库时系统自动首先加载  
  5. jint JNI_OnLoad(JavaVM* vm, void *reserved)  
  6. {  
  7.     JNIEnv *env;  
  8.     if((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK)  
  9.     {  
  10.        return -1;  
  11.     }  
  12.     return JNI_VERSION_1_4;  
  13. }   
  14.   
  15. jstring  
  16. Java_study_jnidemo_JniDemoActivity_stringFromJNI( JNIEnv* env,jobject thiz )  
  17. {  
  18.     return (*env)->NewStringUTF(env,"JniDemo, Hello from JNI!");  
  19. }  
  20.   
  21. jstring  
  22. combine_jstring(JNIEnv* env, jstring str1, jstring str2)  
  23. {  
  24.     jboolean b_ret;  
  25.     constchar *s1 = (*env)->GetStringUTFChars(env, str1, &b_ret);  
  26.     constchar *s2 = (*env)->GetStringUTFChars(env, str2, &b_ret);  
  27.     int n1 = strlen(s1);  
  28.     int n2 = strlen(s2);  
  29.     char *new_str = (char *)malloc(n1+n2+1);  
  30.     memset(new_str, 0, n1+n2+1);  
  31.     strcat(new_str, s1);  
  32.     strcat(new_str, s2);  
  33.     jstring ret_str = (*env)->NewStringUTF(env,(constchar *)new_str);  
  34.     free(new_str);  
  35.   
  36.     return ret_str;  
  37. }  
  38.   
  39. jint  
  40. Java_study_jnidemo_JniDemoActivity_jniStaticShowMessage(JNIEnv* env, jobject thiz,  
  41.        jobject ctx, jstring strTitle, jstring strMessage)  
  42. {  
  43.     jclass cls = (*env)->FindClass(env, "study/jnidemo/JniDemoActivity");  
  44. //  jclass cls = (*env)->GetObjectClass(env, thiz);  
  45.     if(cls != NULL)  
  46.     {  
  47.        jmethodID id = (*env)->GetStaticMethodID(env, cls,  
  48.              "staticShowMessage",  
  49.              "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");  
  50.        if(id != NULL)  
  51.        {  
  52.           return (*env)->CallStaticIntMethod(env, cls, id, ctx, strTitle, strMessage);  
  53.        }  
  54.     }  
  55.     return 1;  
  56. }  
  57.   
  58. // 在当前已有的JAVA实例中调用  
  59. jint  
  60. Java_study_jnidemo_JniDemoActivity_jniShowMessage(JNIEnv* env, jobject thiz,  
  61.        jobject ctx, jstring strTitle, jstring strMessage)  
  62. {  
  63.     jclass cls = (*env)->GetObjectClass(env, thiz);  
  64.     if(cls != NULL)  
  65.     {  
  66.        jstring str;  
  67.        jmethodID strTest_id = (*env)->GetMethodID(env, cls, "getTestString",  
  68.              "()Ljava/lang/String;");  
  69.        if(strTest_id != NULL)  
  70.        {  
  71.           str = (*env)->CallObjectMethod(env, thiz, strTest_id);  
  72.        }  
  73.   
  74.         jmethodID showMessage_id = (*env)->GetMethodID(env, cls, "showMessage",  
  75.              "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");  
  76.   
  77.        if(showMessage_id != NULL)  
  78.        {  
  79.           return (*env)->CallIntMethod(env, thiz, showMessage_id, ctx,  
  80.                  strTitle, combine_jstring(env, strMessage, str));  
  81.        }  
  82.     }  
  83.     return 1;  
  84. }  
  85.   
  86. // 在新建JAVA实例中调用  
  87. jint  
  88. Java_study_jnidemo_JniDemoActivity_jniInstanceShowMessage(JNIEnv* env, jobject thiz,  
  89.        jobject ctx, jstring strTitle, jstring strMessage)  
  90. {  
  91.     jclass cls = (*env)->FindClass(env, "study/jnidemo/JniDemoActivity");  
  92.     if(cls != NULL)  
  93.     {  
  94.        // get instance  
  95.        jmethodID constuctor_id = (*env)->GetMethodID(env, cls, "<init>", "()V");  
  96.        if(constuctor_id != NULL)  
  97.        {  
  98.           jobject obj = (*env)->NewObject(env, cls, constuctor_id);  
  99.           if(obj != NULL)  
  100.           {  
  101.              jstring str;  
  102.              jmethodID strTest_id = (*env)->GetMethodID(env, cls,"getTestString",  
  103.                     "()Ljava/lang/String;");   
  104.   
  105.              if(strTest_id != NULL)  
  106.              {  
  107.                  str = (*env)->CallObjectMethod(env, obj, strTest_id);  
  108.              }   
  109.   
  110.              jmethodID showMessage_id = (*env)->GetMethodID(env, cls,"showMessage",  
  111.                     "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I");  
  112.              if(showMessage_id != NULL)  
  113.              {  
  114.                  return (*env)->CallIntMethod(env, obj, showMessage_id, ctx,  
  115.                         strTitle, combine_jstring(env, strMessage, str));  
  116.              }  
  117.           }  
  118.        }  
  119.     }  
  120.     return 1;  
  121. }  
Android NDK JNI与Java的相互调用 /获取一个自定义java对象//获取一个自定义长度的java对象数组extern "C"//其实这个内容前面基本已经说过,要想通过jni生成一个java类对象,其实最主要的一步就是获取那个java类的对象//1、获取到java类Student的class//2、第二部获取Student的构造方法,第二个参数固定传,第三个方法是签名,无参构造方法的签名就是 ()V//3、获取Student的对象,后面给对象赋值就完成了java类对象的创建。 阅读详情

相关推荐

在Android开发中使用JAVA调用C/C++本地代码

在Android应用程序的开发过程中,我们有时需要通过调用C或C++编写的本地代码来实现一些高性能或底层的功能。首先,我们需要创建一个Android项目,并在项目的"jni"文件夹下创建一个C/C++源文件。通过这个简单的例子,我们可以看到如何在Android开发中使用JAVA调用C/C++本地代码,并且通过JNI实现了JAVA和C/C++之间的交互。现在,我们需要在Android项目的根目录下创建一个名为"CMakeLists.txt"的文件,用于配置本地库的构建。这样,我们就完成了本地库的构建配置。

WangWEel的博客 549

安卓高版本c/c++调用java,通过JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例

c/c++调用java;JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例;libnativehelper; JNI_CreateJavaVM运行挂载libart

我的博客 2422

Android JNI调用过程详解

通过上述步骤,我们成功实现了在Java代码和本地代码之间的相互调用。请注意,本文提供的是基本的JNI调用过程,实际使用中可能会涉及更多复杂的操作和注意事项。完成上述步骤后,您可以自行扩展和修改代码,以满足具体需求。在Android开发中,JNI(Java Native Interface)是一种机制,可以在Java代码和本地代码之间进行相互调用。本文将详细介绍JNI调用过程,并附带完整的源代码和描述。这将生成名为"NativeClass.h"的本地头文件。至此,我们完成了JNI调用过程。

Book_Sea的博客 407

Android 中的Java跟C/C++的Binder通信

1、大家都知道Android中进程间的通信是通过binder来实现的,这里主要是讲代码中的简单实现。如果想了解binder的通信细节或实现原理,可以参考https://blog.youkuaiyun.com/jmq_0000/article/details/7349844。个人觉得这篇博客讲的还是很不错的。现在就开始demo的介绍,该demo主要是通过java传递文件路径给C++来实现删除该路径,目的是为了了...

u013357557的专栏 3941

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

C/C++ 计算程序运行的时间

C/C++计算程序执行时间的方法,精度依次增加,推荐度也依次增加 1.#include <time.h> clock_t start, finish; double process_interval ; start=clock(); process(); //要计时的程序 finish=clock(); process_interval =(double)(finish-star...

stu_shanghui的博客 1020

jni文件 so文件编译和jni调用

Android之NDK环境配置+JNI开发+so文件编译 - 静静是小花 - 博客园前言 这边Android作为日常记录,虽然破坏了文章队形~ 最近人工智能挺火的,也稍微了解了一些库,比如关于视觉库openCV。要在安卓下调用这些C/C++库,需要用到JNI开发,在此把过程分享一下。https://www.cnblogs.com/hongdiandian/p/9025089.html ...

shuangrenlong的博客 1178

BACnet/IP BBMD跨网段通信深度解析与最佳实践

本文介绍了在BACnet/IP网络中通过BBMD实现跨子网设备通信的关键配置方法。重点阐述了广播分发表(BDT)中掩码设置的重要性:使用子网掩码(255.255.255.0)会导致路由器拦截广播消息,而必须采用主机掩码(255.255.255.255)才能启用单播隧道机制,使BACnet广播消息封装为可路由的单播UDP包。文章详细说明了BDT条目的正确配置格式、BIP广播地址的作用,并提供了验证步骤,强调在跨网段场景中,正确设置掩码是确保设备发现和通信成功的关键因素。

零一架构师的专栏 1536

Android中JNI&NDK入门(一) 之 初识NDK和JNI

1 NDK NDK全称是Native Develop Kit,翻译作原生开发工具包。它允许你为Android使用C/C++代码来实现应用程序的功能。换言之Android的SDK之外,有一个工具叫NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后在Java中调用。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架...

子云心的博客 2151

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 271

STM32F103上跑mbedtls 2.24.0:手把手教你为MQTTS加密通信打好基础

本文详细介绍了如何在STM32F103上移植和裁剪mbedtls 2.24.0,为MQTTS加密通信打下坚实基础。通过版本选择、开发环境配置、深度裁剪策略和加密功能验证,帮助开发者在资源受限的MCU上实现安全通信。文章还提供了常见问题解决方案和性能优化技巧,助力物联网设备开发。

weixin_30321709的博客 462

JNI机制源码解析

1, 基本概念 1,JNI 是什么? 2,JNI 有和作用? 3,JNI 为什么存在? JNI(Java Native Interface): java 本地接口。Natvie 一般指 C/C++。 可以这么说,JNI是 java 和 C/C++ 之间的桥梁,通过JNI技术, java 和 C/C++ 可以互相调用。    首先,Java是平台无关的,但是承载java的虚拟机是用C/C

Jack的博客 5521

STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)

单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片唤醒驱动程序。 一、RxDutyCycle模式 在讲述本篇内容之前,我们先来看一下SX1268的一种模式RxDutyCycle,译为中文为接收占空比模式。其可使用SetRxDutyCycle命令进入RxDutyCycle模式,我们来看一下该命令的详细解释。 该命令具有2个参数,...

snmplink的博客 4068

java 对象转 native_[转] Android JNI学习(三)——Java与Native相互调用

本系列文章如下:Android JNI(一)——NDK与JNI基础Android JNI学习(二)——实战JNI之“hello world”Android JNI学习(三)——Java与Native相互调用Android JNI学习(四)——JNI的常用方法的中文APIAndroid JNI学习(五)——Demo演示1、注册native函数2、JNI中的签名3、native代码反调用Java层代码...

weixin_35901475的博客 259

华为OD机试真题2026双机位C卷 C语言 实现【明日之星选举】

给定一组选票votes。votes[i]代表第 i 张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan为明日之星,反对 hanmei 称为明日之星。赞成或反对使用逗号(,)分割。 给定一个数组n,表示最后将筛选出赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。

MISAYAONE的博客 184

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 172

安卓JNI基础知识

JNI 是java原生接口(Java Native Interface),它定义了 Android 从受管理代码(使用 Java 或 Kotlin 编程语言编写)编译的字节码与原生代码(使用 C/C++ 编写)进行交互的方法,也就是安卓通过JNI技术提供Java调用C/C++或者C/C++调用Java的能力。JNI 不依赖于供应商,支持从动态共享库加载代码,虽然有时较为繁琐,但效率较高。

Watom_663的博客 1259

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JNI 技术总结

C/C++ 调用java ,java调用C/C++

qq_19686597的博客 1089

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JNI使用总结

相关概念 什么是jni 关于nkd 什么是交叉编译 C/C++语言常见术语 库函数 头文件 函数库 HelloWorld Java调用CC方法 CC方法调用Java方法 相关api 示例 数据类型的对应 jstring转换char char转换jstring C与C++中JNI实现的区别 JNIEnv 方法调用的区别 Androidmk说明 绕过JNI直接调用C函数 中文乱码问题 解决方法名冲突 注册JNI函数 静态注册 动态注册

3245

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Eclipse开发NDK

1. 概念了解: 交叉编译: 在一个平台下,编译另外一个平台能够执行二进制的代码 windows下编译 成android 平台可以运行的汇编 工具: ndk cdt: Eclipse开发c/c++插件 , 如果eclipse没有安装需要安装,查看是否安装该插件 ##NDK目录结构 * docs:帮助文档: HOW TO:相当于index * ...

dreams_deng的博客 2726

JNI(一) JNI - NDK-交叉编译

Jni NDK 以及交叉编译的基础知识

Applicaton的专栏 2648

c++封装so库,供安卓android调用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

刚入视频监控行业的菜鸡2090741348 8782
上一篇: Service隐式显示启动
下一篇: TCP与UDP区别
zwyAndroid
博客等级 码龄11年 5粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值