1. #include <jni.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <jni.h>
  5. #include <android/log.h>
  6. #define LOG_TAG "System.out"
  7. //日志乱码时请将项目文件编码设置为UTF-8
  8. /**debug级别日志:ANDROID_LOG_DEBUG:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/
  9. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
  10. /**info级别日志:ANDROID_LOG_INFO:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/
  11. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
  12.  
  13. extern "C" {
  14.  
  15. /***java语言String转C语言char***/
  16. char* JstringTochar(JNIEnv *env, jstring jstr) {
  17. char* rtn = NULL;
  18. jclass classtring = env->FindClass("java/lang/String");
  19. jstring strencode = env->NewStringUTF("GB2312");
  20. jmethodID mid = env->GetMethodID(classtring, "getBytes","(Ljava/lang/String;)[B");
  21. jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
  22. jsize alen = env->GetArrayLength(barr);
  23. jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
  24. if (alen > 0) {
  25. rtn = (char*) malloc(alen + 1);
  26. memcpy(rtn, ba, alen);
  27. rtn[alen] = 0;
  28. }
  29. env->ReleaseByteArrayElements(barr, ba, 0);
  30. return rtn;
  31. }
  32.  
  33. JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_hello(JNIEnv *env,jobject obj) {
  34. LOGD("%s", "haha");
  35. return env->NewStringUTF("Hello from JNI !");
  36. }
  37.  
  38. /***2个整数相加***/
  39. JNIEXPORT jint Java_com_example_ndktest_JNIProvideer_add(JNIEnv *env,jobject obj,jint x,jint y){
  40. return x+y;
  41. }
  42.  
  43. /***字符串转换***/
  44. JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_sayHello(JNIEnv *env,jobject obj,jstring jstr){
  45. char* p=JstringTochar(env,jstr);
  46. LOGI("sss%s",p);
  47. //strcat(p,helloWord)表示helloWordƴ拼接到p后面
  48. return env->NewStringUTF(strcat(p,"helloWord"));
  49. }
  50.  
  51. /***整数数组每一个元素加10***/
  52. JNIEXPORT jintArray Java_com_example_ndktest_JNIProvideer_getIntArray(JNIEnv *env,jobject obj,jintArray jintarr){
  53. //获取数组长度
  54. int len=env->GetArrayLength(jintarr);
  55. LOGI("len=%d",len);
  56. //获取整数数组地址
  57. jint* arr=env->GetIntArrayElements(jintarr,0);
  58. for (int i=0; i < len; i++) {
  59. *(arr+i)+=10;
  60. }
  61. return jintarr;
  62. }
  63. /***主动调用java对象中方法String getString()
  64. * ()Ljava/lang/String;表示参数为空,返回值为String***/
  65. JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetString(JNIEnv *env,jobject obj) {
  66. jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
  67. if(classz==0){
  68. LOGI("can't find class");
  69. }else{
  70. LOGI("find class");
  71. }
  72. jmethodID javaMethod=env->GetMethodID(classz,"getString","()Ljava/lang/String;");
  73. if(javaMethod==0){
  74. LOGI("can't find menthod");
  75. }else{
  76. LOGI("find menthod");
  77. }
  78. jstring result= (jstring)env->CallObjectMethod(obj,javaMethod);
  79. char* p=JstringTochar(env,result);
  80. LOGI("result=%s",p);
  81. }
  82.  
  83. /***主动调用java对象中方法int getAdd(int x,int y)
  84. * (II)I表示参数为2个整数,返回值为整数***/
  85. JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetAdd(JNIEnv *env,jobject obj) {
  86. jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
  87. if(classz==0){
  88. LOGI("can't find class");
  89. }else{
  90. LOGI("find class");
  91. }
  92. jmethodID javaMethod=env->GetMethodID(classz,"getAdd","(II)I");
  93. if(javaMethod==0){
  94. LOGI("can't find menthod");
  95. }else{
  96. LOGI("find menthod");
  97. }
  98. int result= env->CallIntMethod(obj,javaMethod,7,7);
  99. LOGI("result=%d",result);
  100.  
  101. }
  102.  
  103. /***主动调用java对象中方法void getvoidMethod(String x)
  104. * (Ljava/lang/String;)V表示参数为String,返回值为空***/
  105. JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetvoidMethod(JNIEnv *env,jobject obj) {
  106. jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
  107. if(classz==0){
  108. LOGI("can't find class");
  109. }else{
  110. LOGI("find class");
  111. }
  112. jmethodID javaMethod=env->GetMethodID(classz,"getvoidMethod","(Ljava/lang/String;)V");
  113. if(javaMethod==0){
  114. LOGI("can't find menthod");
  115. }else{
  116. LOGI("找到方法");
  117. }
  118. env->CallVoidMethod(obj,javaMethod,env->NewStringUTF("abc"));
  119. }
  120.  
  121. }

  

  1. package com.example.ndktest;
  2.  
  3. import android.util.Log;
  4.  
  5. public class JNIProvideer {
  6. static{
  7. System.loadLibrary("ndkTest");
  8. }
  9. public native int add(int x,int y);
  10. public native String sayHello(String s);
  11. public native int[] getIntArray(int[] ints);
  12. public native String hello();
  13. public native void getJavaMethodForGetString();
  14. public native void getJavaMethodForGetAdd();
  15. public native void getJavaMethodForGetvoidMethod();
  16. /**
  17. *让c语言主动调用的方法
  18. * @return
  19. */
  20. public String getString(){
  21. return "hello";
  22. }
  23. /**
  24. *让c语言主动调用的方法
  25. * @return
  26. */
  27. public int getAdd(int x,int y){
  28. return x+y;
  29. }
  30. /**
  31. * 让c语言主动调用的方法
  32. * @return
  33. */
  34. public void getvoidMethod(String x){
  35. Log.i("test", "输入值:"+x);
  36. }
  37. }

  

  1. package com.example.ndktest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.Toast;
  9.  
  10. public class MainActivity extends Activity {
  11. public native String hello();
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.fragment_main);
  16. Button tx= (Button) findViewById(R.id.test);
  17. tx.setOnClickListener(new OnClickListener() {
  18.  
  19. @Override
  20. public void onClick(View v) {
  21. JNIProvideer jNIProvideer=new JNIProvideer();
  22. String result="";
  23.  
  24. //result=jNIProvideer.hello();
  25.  
  26. //int add=jNIProvideer.add(4, 5);
  27. //result=add+"";
  28.  
  29. //int[] intarray=jNIProvideer.getIntArray(new int[]{3,5,5,4});
  30. //for (int i = 0; i < intarray.length; i++) {
  31. //result+=intarray[i];
  32. //}
  33.  
  34. //result=jNIProvideer.sayHello("say:");
  35. //jNIProvideer.getJavaMethodForGetString();
  36. //jNIProvideer.getJavaMethodForGetAdd();
  37. jNIProvideer.getJavaMethodForGetvoidMethod();
  38. //Toast.makeText(getApplicationContext(), result, 0).show();
  39. }
  40. });
  41. }
  42. }

  

JNI学习2:android 调用C语言方法与C语言调用android方法的更多相关文章

  1. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  2. JNI学习笔记_Java调用C —— Android中使用的方法

    一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...

  3. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  5. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  7. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  8. Android NDK 初探,生成so文件以及调用so文件方法

    因为最近业务上涉及安全的问题 然后有一些加密解密的方法和key的存储问题 本来想存储到手机里面,但是网上说一般敏感信息不要存储到手机Sdcard上 而且我这个如果从网络建立通信获取的话,又太耗时,所以 ...

  9. 技术转载:Jni学习四:如何编写jni方法

    转载:http://blog.chinaunix.net/u1/38994/showart_1099528.html 一.概述: 在这篇文章中将会简单介绍如何编制一些简单的JNI 方法.我们都知道JN ...

随机推荐

  1. jstl表达式替换某些字符

    转自:http://www.yiibai.com/jsp/jstl_function_replace.html fn:replace() 函数替换一个字符串与另一个字符串的所有匹配. 语法 fn:re ...

  2. 转 15款免费WiFi(入侵破解)安全测试工具

    转:http://www.ctocio.com/security/cloudsecurity/6594.html 一.Vistumbler扫描器 WiFi 扫描器能能发现附近AP的详细信息,例如信号强 ...

  3. 无线安全渗透测试套件WiFi-Pumpkin新版本发布

    WiFi-Pumpkin是一款无线安全检测工具,利用该工具可以伪造接入点完成中间人攻击,同时也支持一些其它的无线渗透功能.旨在提供更安全的无线网络服务,该工具可用来监听目标的流量数据,通过无线钓鱼的方 ...

  4. Osmocom-BB多信道修改代码相关

    修改bb\src\target\firmware\layer1\prim_rx_nb.c 文件 这个nb表示normalburst,指的是ccch的数据,用专业的术语,应该是,一个ccch的burst ...

  5. HDOJ-三部曲一(搜索、数学)-1008-Prime Path

    Prime Path Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total S ...

  6. JQuery源码分析(六)

    方法链式调用的实现 写的更少,做的更多.是JQuery的核心理念. 那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指Domain S ...

  7. 13、C#基础整理(枚举)

    枚举 1.概念和作用 (1)用于存放常量,只能在定义时赋值(防止编程过程中恶意篡改,并且防止对同一事物的不同赋值--统一化) (2)定义的枚举类型需要包含该类型的所有可能的值 (3)方法.类.内部都可 ...

  8. HDU 1052

    http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌赛马本质就是一个贪心 res表示田忌的胜利场次 1.田忌最快马快于王的最快马,两个最快马比,res++ ...

  9. HDU 5050

    http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数gcd import java.io.* ; import java.math.* ; import ...

  10. php-多态

    <?php //面对对象三大特性//封装//目的:让类更安全//做法:成员变量变为私有的,通过方法来间接操作成员变量,在方法里面加限制条件 //继承//概念:子类可以继承父类的一切//方法重写: ...