ndk c调用java函数


转自:http://blog.csdn.net/yuxmdef1/article/details/17560405

静态函数调用代码

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.as;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.content.res.Resources.Theme;  
  6. import android.view.Menu;  
  7. import android.widget.TextView;  
  8.   
  9. public class MainActivity extends Activity {  
  10.   
  11.     @Override   
  12.     public void onCreate(Bundle savedInstanceState)   
  13.       {   
  14.         try {  
  15.             Thread.sleep(5000);  
  16.         } catch (InterruptedException e) {  
  17.             // TODO Auto-generated catch block  
  18.             e.printStackTrace();  
  19.         }  
  20.         super.onCreate(savedInstanceState);   
  21.         TextView  tv = new TextView(this);   
  22.         stringFromJNI();  
  23. //        tv.setText(  );   
  24.         setContentView(tv);   
  25.       }   
  26.     public native String  stringFromJNI();   
  27.     public static int add(int x, int y) {   
  28.         System.out.println("==Java静态add方法==");   
  29.         return x + y;   
  30.         }   
  31.     static {   
  32.             System.loadLibrary("AS");   
  33.     }  
  34.   
  35. }  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <jni.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4.   
  5. int Java_com_example_as_MainActivity_stringFromJNI(JNIEnv* env,  
  6.         jobject thiz) {  
  7.   
  8.     // 获取类  
  9.     jclass AnalyzeCidUtil = (*env)->FindClass(env,"com/example/as/MainActivity");  
  10.     if (NULL == AnalyzeCidUtil) {  
  11.         return -1;  
  12.     }  
  13.   
  14.     // 获取类add静态方法  
  15.     jmethodID add = (*env)->GetStaticMethodID(env,AnalyzeCidUtil, "add""(II)I");  
  16.     if (NULL == add) {  
  17.         (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引  
  18.         return -2;  
  19.     }  
  20.   
  21.     // 调用静态int方法  
  22.     int result = (*env)->CallStaticIntMethod(env,AnalyzeCidUtil, add, 3, 5);  
  23.   
  24.     return 0;  
  25. }  

代码解释


java中定义了一个静态函数publicstaticintadd(intx,inty) ,在C中通过FindClass找到类,GetStaticMethodID找到方法,通过CallStaticIntMethod调用方法
GetStaticMethodID的第4个参数是什么意思呢? "(II)I"
这个是方法签名

方法签名

 

在这里有必要单独来讲一讲这个方法签名,为什么要用这个东东呢?我们知道,在Java里方法是可以被重载的。"(II)I"表示的就是这个函数参数为2个int,返回值为int
其实除了自己对照手写之外,JDK也提供了一个很好用的生成签名的工具javap,cmd进入控制台到你要生成签名的那个类的class文件目录下。如我这里是MainActivity得到结果如下:

 
E:\Users\fish\workspace\AS\bin\classes\com\example\as>javap -s MainActivity
Compiled from "MainActivity.java"
public class com.example.as.MainActivity extends android.app.Activity{
static {};
  Signature: ()V
public com.example.as.MainActivity();
  Signature: ()V
public void onCreate(android.os.Bundle);
  Signature: (Landroid/os/Bundle;)V
public native java.lang.String stringFromJNI(java.lang.String);
  Signature: (Ljava/lang/String;)Ljava/lang/String;
public native java.lang.String unimplementedStringFromJNI();
  Signature: ()Ljava/lang/String;
public static int add(int, int);
  Signature: (II)I
}
这就是函数和签名的对照表

非静态函数调用代码


其实很简单就是多调用一个构造函数构造出一个实例来再去调用非静态函数

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.as;  
  2.    
  3.  import android.os.Bundle;  
  4.  import android.app.Activity;  
  5.  import android.content.res.Resources.Theme;  
  6.  import android.view.Menu;  
  7.  import android.widget.TextView;  
  8.    
  9.  public class MainActivity extends Activity {  
  10.    
  11.      @Override   
  12.      public void onCreate(Bundle savedInstanceState)   
  13.        {   
  14.          try {  
  15.              Thread.sleep(5000);  
  16.          } catch (InterruptedException e) {  
  17.              // TODO Auto-generated catch block  
  18.              e.printStackTrace();  
  19.          }  
  20.          super.onCreate(savedInstanceState);   
  21.          TextView  tv = new TextView(this);   
  22.          stringFromJNI();  
  23.  //        tv.setText(  );   
  24.          setContentView(tv);   
  25.        }   
  26.      public native String  stringFromJNI();    
  27.      public static int add(int x, int y) {   
  28.          System.out.println("==Java静态add方法==");   
  29.          return x + y;   
  30.          }   
  31.      static {   
  32.              System.loadLibrary("AS");   
  33.      }  
  34.        
  35.      /** C回调Java方法(非静态) */   
  36.      public int sub(int x, int y) {   
  37.      System.out.println("==Java非静态sub方法==");   
  38.      return x - y;   
  39.      }   
  40.    
  41.  }  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <jni.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4. /** 
  5.  * 实例化类对象 
  6.  */  
  7. jobject getInstance(JNIEnv *env, jclass clazz) {  
  8.     // 获取构造方法  
  9.     jmethodID constructor = (*env)->GetMethodID(env,clazz, "<init>""()V");  
  10.     if (NULL == constructor) {  
  11.         return NULL;  
  12.     }  
  13.     // 实例化类对象  
  14.     return (*env)->NewObject(env,clazz, constructor);  
  15. }  
  16. int Java_com_example_as_MainActivity_stringFromJNI(JNIEnv* env,  
  17.         jobject thiz) {  
  18.   
  19.         // 获取类  
  20.         jclass  AnalyzeCidUtil = (*env)->FindClass(env,"com/example/as/MainActivity");  
  21.         if (NULL == AnalyzeCidUtil) {  
  22.             return -1;  
  23.         }  
  24.   
  25.         // 实例化类对象  
  26.         jobject mAnalyzeCidUtil = getInstance(env, AnalyzeCidUtil);  
  27.         if (NULL == mAnalyzeCidUtil) {  
  28.             (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引  
  29.             return -2;  
  30.         }  
  31.   
  32.         // 获取对象sub方法  
  33.         jmethodID sub = (*env)->GetMethodID(env,AnalyzeCidUtil, "sub""(II)I");  
  34.         if (NULL == sub) {  
  35.             (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引  
  36.             (*env)->DeleteLocalRef(env,mAnalyzeCidUtil); // 删除类对象指引  
  37.             return -3;  
  38.         }  
  39.   
  40.         // 调用非静态int方法  
  41.         int result = (*env)->CallIntMethod(env,mAnalyzeCidUtil, sub, 6, 76);  
  42.           
  43.   
  44.     return 0;  
  45. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 中使用 Java 调用 C++ 实例需要进行以下步骤: 1. 编写 C++ 代码,并将其打包成可供 Java 调用的库文件(.so 文件)。 2. 在 Java 中使用 JNIJava Native Interface)调用 C++ 库。 下面是一个简单的示例: 1. 编写 C++ 代码并将其打包成库文件 在 C++ 中编写代码,将其打包成可供 Java 调用的库文件。以下是一个简单的示例,在 C++ 中实现一个函数,计算两个整数的和,并将其打包成库文件: ```c++ // sum.cpp #include <jni.h> extern "C" JNIEXPORT jint JNICALL Java_com_example_sum_MainActivity_sum(JNIEnv *env, jclass clazz, jint a, jint b) { return a + b; } ``` 编译 C++ 代码,并将其打包成可供 Java 调用的库文件。可以使用 Android NDK 工具链来编译 C++ 代码,并生成库文件。以下是一个简单的示例: ```shell $ cd /path/to/project $ ndk-build ``` 编译完成后,将会在项目的 libs 目录下生成库文件(.so 文件)。在本例中,生成的库文件名为 libsum.so。 2. 在 Java 中使用 JNI 调用 C++ 库 在 Java 中使用 JNI 调用 C++ 库,需要进行以下步骤: a. 加载库文件: 在 Java 中使用 System.loadLibrary() 方法加载库文件。以下是一个简单的示例: ```java static { System.loadLibrary("sum"); } ``` 在本例中,将会加载名为 libsum.so 的库文件。 b. 声明本地方法: 在 Java 中声明本地方法,即 JNI 调用 C++ 库中的函数。以下是一个简单的示例: ```java public static native int sum(int a, int b); ``` c. 实现本地方法: 在 Java 中实现本地方法,即调用 JNI 调用 C++ 库中的函数。以下是一个简单的示例: ```java public static int sum(int a, int b) { return sum(a, b); } private static native int sum(int a, int b); ``` 在本例中,调用 sum() 方法时,会调用本地方法 sum(),并最终调用 C++ 库中的 sum() 函数。 至此,完成了在 Android Studio 中使用 Java 调用 C++ 实例的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值