#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "System.out"
//日志乱码时请将项目文件编码设置为UTF-8
/**debug级别日志:ANDROID_LOG_DEBUG:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
/**info级别日志:ANDROID_LOG_INFO:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) extern "C" { /***java语言String转C语言char***/
char* JstringTochar(JNIEnv *env, jstring jstr) {
char* rtn = NULL;
jclass classtring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(classtring, "getBytes","(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
} JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_hello(JNIEnv *env,jobject obj) {
LOGD("%s", "haha");
return env->NewStringUTF("Hello from JNI !");
} /***2个整数相加***/
JNIEXPORT jint Java_com_example_ndktest_JNIProvideer_add(JNIEnv *env,jobject obj,jint x,jint y){
return x+y;
} /***字符串转换***/
JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_sayHello(JNIEnv *env,jobject obj,jstring jstr){
char* p=JstringTochar(env,jstr);
LOGI("sss%s",p);
//strcat(p,helloWord)表示helloWordƴ拼接到p后面
return env->NewStringUTF(strcat(p,"helloWord"));
} /***整数数组每一个元素加10***/
JNIEXPORT jintArray Java_com_example_ndktest_JNIProvideer_getIntArray(JNIEnv *env,jobject obj,jintArray jintarr){
//获取数组长度
int len=env->GetArrayLength(jintarr);
LOGI("len=%d",len);
//获取整数数组地址
jint* arr=env->GetIntArrayElements(jintarr,0);
for (int i=0; i < len; i++) {
*(arr+i)+=10;
}
return jintarr;
}
/***主动调用java对象中方法String getString()
* ()Ljava/lang/String;表示参数为空,返回值为String***/
JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetString(JNIEnv *env,jobject obj) {
jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
if(classz==0){
LOGI("can't find class");
}else{
LOGI("find class");
}
jmethodID javaMethod=env->GetMethodID(classz,"getString","()Ljava/lang/String;");
if(javaMethod==0){
LOGI("can't find menthod");
}else{
LOGI("find menthod");
}
jstring result= (jstring)env->CallObjectMethod(obj,javaMethod);
char* p=JstringTochar(env,result);
LOGI("result=%s",p);
} /***主动调用java对象中方法int getAdd(int x,int y)
* (II)I表示参数为2个整数,返回值为整数***/
JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetAdd(JNIEnv *env,jobject obj) {
jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
if(classz==0){
LOGI("can't find class");
}else{
LOGI("find class");
}
jmethodID javaMethod=env->GetMethodID(classz,"getAdd","(II)I");
if(javaMethod==0){
LOGI("can't find menthod");
}else{
LOGI("find menthod");
}
int result= env->CallIntMethod(obj,javaMethod,7,7);
LOGI("result=%d",result); } /***主动调用java对象中方法void getvoidMethod(String x)
* (Ljava/lang/String;)V表示参数为String,返回值为空***/
JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetvoidMethod(JNIEnv *env,jobject obj) {
jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");
if(classz==0){
LOGI("can't find class");
}else{
LOGI("find class");
}
jmethodID javaMethod=env->GetMethodID(classz,"getvoidMethod","(Ljava/lang/String;)V");
if(javaMethod==0){
LOGI("can't find menthod");
}else{
LOGI("找到方法");
}
env->CallVoidMethod(obj,javaMethod,env->NewStringUTF("abc"));
} }

  

package com.example.ndktest;

import android.util.Log;

public class JNIProvideer {
static{
System.loadLibrary("ndkTest");
}
public native int add(int x,int y);
public native String sayHello(String s);
public native int[] getIntArray(int[] ints);
public native String hello();
public native void getJavaMethodForGetString();
public native void getJavaMethodForGetAdd();
public native void getJavaMethodForGetvoidMethod();
/**
*让c语言主动调用的方法
* @return
*/
public String getString(){
return "hello";
}
/**
*让c语言主动调用的方法
* @return
*/
public int getAdd(int x,int y){
return x+y;
}
/**
* 让c语言主动调用的方法
* @return
*/
public void getvoidMethod(String x){
Log.i("test", "输入值:"+x);
}
}

  

package com.example.ndktest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity {
public native String hello();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
Button tx= (Button) findViewById(R.id.test);
tx.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
JNIProvideer jNIProvideer=new JNIProvideer();
String result=""; //result=jNIProvideer.hello(); //int add=jNIProvideer.add(4, 5);
//result=add+""; //int[] intarray=jNIProvideer.getIntArray(new int[]{3,5,5,4});
//for (int i = 0; i < intarray.length; i++) {
//result+=intarray[i];
//} //result=jNIProvideer.sayHello("say:");
//jNIProvideer.getJavaMethodForGetString();
//jNIProvideer.getJavaMethodForGetAdd();
jNIProvideer.getJavaMethodForGetvoidMethod();
//Toast.makeText(getApplicationContext(), result, 0).show();
}
});
}
}

  

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. Osmocom-BB中cell_log的多种使用姿势

    转载留做备份,原文地址:http://92ez.com/?action=show&id=23342 翻阅osmocom-bb源码的时候注意到,在cell_log中有非常多我们从来没有注意到的功 ...

  2. UITableView全面解析,讲的好详细

    --UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...

  3. Windows 2003 AD升级Windows 2008

    把Windows 2008 R2的光盘放到主域控中,运行 adprep32 /forestPrep adprep32 /domainprep adprep32 /domainprep /gpprep ...

  4. The Triangle_DP

    ime Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45620   Accepted: 27612 Description 73 8 ...

  5. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  6. 使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)

    ; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "小小鸟软件"#def ...

  7. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  8. 结构体用于map,set时要重载运算符<

    #include<iostream> #include<set> using namespace std; struct P { int entry; int time; bo ...

  9. 《JS高程》JS-Object对象整理

    继上篇<JS高程>对象&原型笔记,对JavaScript中的Object对象进行了整理,梳理一遍~ 参考文章:详解Javascript中的Object对象 ------------ ...

  10. insertAdjacentHTML

    /** * insertAdjacentHTML * 支持 insertAdjacentHTML()方法的浏览器有 IE.Firefox 8+.Safari.Opera 和 Chrome */ var ...