1、编写native方法(java2c)和非native方法(c2java):

package com.example.provider;

public class CallbackJava {

    // C调用java空方法
public void helloFromJava() { System.out.println("hello from java");
} // C调用java中的带两个int参数的方法
public int Add(int x, int y) {
int result = x + y;
System.out.println("java result=" + result);
return result;
} // C调用java中参数为string的方法
public void printString(String s) {
System.out.println("java " + s);
} //静态方法
public static void printStaticStr(String s) {
System.out.println("java static-> " + s);
} // 让c代码调用对应的java代码
public native void callHelloFromJava(); public native void callAdd(); public native void callPrintString(); // 调用一个静态的c代码
public native void callPrintStaticStr();
}
 

2、通过javah命令生成签名,通过javap命令生产native方法签名:

  

3、c代码

FindClass:找到java中的类文件
GetMethodID:根据类和方法签名找到要调用的方法。
#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_provider_CallbackJava.h";
#include "com_example_jni_MainActivity.h"; #include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) jmethodID getMethodId(JNIEnv * env, char* methodname, char* signname) {
jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");
if (jclazz == 0) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz, methodname, signname);
if (methodid == 0) {
LOGD("method not find ");
return;
}
return methodid;
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callHelloFromJava
(JNIEnv * env, jobject obj) {
//1、 找java中的class文件
//第二个参数是类名的(包名)
jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");
if(jclazz==0) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==0) {
LOGD("helloFromJava method not find ");
return;
}
//3、调用方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,obj,methodid);
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callAdd
(JNIEnv *env, jobject obj) {
jmethodID mid = getMethodId(env,"Add","(II)I");
int result = (*env)->CallIntMethod(env, obj, mid,3,6);
LOGD("c to java add: d%",result);
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintString
(JNIEnv *env, jobject obj) {
LOGD("c to java callPrintString start ");
jmethodID mid = getMethodId(env,"printString","(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env, obj, mid,(*env)->NewStringUTF(env," call printString finish"));
LOGD("c to java callPrintString finish ");
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintStaticStr
(JNIEnv *env, jobject obj) {
jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");
if (jclazz == 0) {
LOGD("class not find ");
return;
}
//静态方法调用GetStaticMethodID 和 CallStaticXXXMethod
jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz, "printStaticStr", "(Ljava/lang/String;)V");
if (methodid == 0) {
LOGD("printStaticStr method not find ");
return;
}
(*env)->CallStaticVoidMethod(env, jclazz, methodid,(*env)->NewStringUTF(env,"static hello java")); } JNIEXPORT void JNICALL Java_com_example_jni_MainActivity_callProvider
(JNIEnv *env, jobject obj){
jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");
if(jclazz==0) {
LOGD("class not find ");
return;
}
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==0) {
LOGD("helloFromJava method not find ");
return;
}
//创建一个CallbackJava对象
jobject jobj =(*env)->AllocObject(env, jclazz);
(*env)->CallVoidMethod(env,jobj,methodid); }
 

4、编译多个c文件可以用空格分开

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=Hello
#LOCAL_SRC_FILES :=Hello.c
LOCAL_SRC_FILES :=CallbackJava.c Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

参考http://www.open-open.com/lib/view/open1359700820369.html

六、Android学习笔记_JNI_c调用java代码的更多相关文章

  1. Android学习笔记_JNI_c调用java代码

    1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...

  2. JNI学习笔记_C调用Java

    一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...

  3. android Webview 实现js调用java代码实现Activity跳转

    今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...

  4. Android学习笔记(9):使用XML文件和Java代码控制UI界面

    Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...

  5. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  6. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  7. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

  8. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  9. 【转】Pro Android学习笔记(十二):了解Intent(下)

    解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...

随机推荐

  1. linux C(hello world) 二维数组的练习

  2. corner2

    Original: https://github.com/LondonX/corner2 Backup: https://github.com/eltld/corner2

  3. Linux显示全部执行中的进程

    Linux显示全部执行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...

  4. sqlserver 行转列 语文,数学,物理,化学

    数据库查询行转列 1.原数据库值 stdname stdsubject result 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 李四 化学 李四 化学 2.要得到如下表 ...

  5. paip.android 手机输入法制造大法

    paip.android 手机输入法制造大法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/at ...

  6. GCC 编译选项(转)

    转:http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html gcc提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常 ...

  7. JS 解析Xml

    loadXML = function (xmlString) { var xmlDoc = null; //判断浏览器的类型 //支持IE浏览器 if (!window.DOMParser & ...

  8. iOS 应用程序的生命周期

    iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...

  9. Git_Windows 系统下Git安装图解

    Windows 系统下Git安装图解  心得  :很成功~ 简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工 ...

  10. MySQL(22):事务管理之 事务回滚

    1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时 ...