Android Ndk中C与JAVA之间的互相调用

本例实现一个简单的场景:

1、使用C编写一个方法,接收1个参数,方法中调用Java的方法。

2、Java类中编写一个方法,接收一个参数。

3、模拟调用场景:点击按钮 -> 调用C方法 -> C调用Java方法 -> 获得返回值 -> Toast提示。

项目结构图:

代码如下:

CcallJava.java


package com.shanhy.example.ccalljava;

/**
 * C调用Java的方法
 *
 * @author SHANHY(365384722@QQ.COM)
 * @date   2015年11月20日
 */
public class CcallJava {

	public String testCall(String str){
		return "大家好!" + str;
	}
}

MainActivity.java

package com.shanhy.example.ccalljava;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

/**
 * 加密 NDK 开发
 *
 * @author SHANHY(365384722@QQ.COM)
 * @date 2015年11月19日
 */
public class MainActivity extends Activity {

	// 也就是你mk配置文件中的 LOCAL_MODULE
	private static final String libSoName = "shanhyNdk";

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	/**
	 * 绑定给布局文件的onClick方法
	 *
	 * @param v
	 * @author SHANHY
	 * @date   2015年11月20日
	 */
	public void testCcallJava(View v) {
		LogUtils.toastMessage(MainActivity.this, stringFromJNI("我叫返回值,我被C调用了 ^_^"));
	}

	/**
	 * 声明本地方法
	 *
	 * 该方法为native方法.由C实现
	 *
	 * @return JNI 给出的信息
	 */
	public native String stringFromJNI(String strText);

	/**
	 * 载入JNI生成的so库文件
	 */
	static {
		System.loadLibrary(libSoName);
	}

}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := shanhyNdk
LOCAL_SRC_FILES := shanhyNdk.cpp myJNI.h

include $(BUILD_SHARED_LIBRARY)

myJNI.h

#include <jni.h>

#ifndef _Included_com_shanhy_example_MainActivity
#define _Included_com_shanhy_example_MainActivity
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_com_shanhy_example_ccalljava_MainActivity_stringFromJNI(JNIEnv *, jobject, jstring strText);

#ifdef __cplusplus
}
#endif
#endif

shanhyNdk.cpp

#include "myJNI.h"

jobject getInstance(JNIEnv* env, jclass obj_class){
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}

JNIEXPORT jstring JNICALL Java_com_shanhy_example_ccalljava_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz, jstring strText){
   jstring str;
   jclass java_class = env->FindClass("com/shanhy/example/ccalljava/CcallJava");
    if (java_class == 0){
       return env->NewStringUTF("not find class!");
    }
   jobject java_obj = getInstance(env, java_class);
   if (java_obj == 0){
       return env->NewStringUTF("not find java OBJ!");
   }
   jmethodID java_method = env->GetMethodID(java_class, "testCall", "(Ljava/lang/String;)Ljava/lang/String;");
   if(java_method == 0){
       return env->NewStringUTF("not find java method!");
   }
   str = (jstring)env->CallObjectMethod(java_obj, java_method, strText);

   return str;
}

源码下载地址:http://download.csdn.net/detail/catoop/9286135

时间: 2024-10-27 16:01:23

Android Ndk中C与JAVA之间的互相调用的相关文章

Android代码中多个surfaceview之间的切换以及传递数据

问题描述 Android代码中多个surfaceview之间的切换以及传递数据 开发2D游戏时:在游戏进行中时,按下返回键,出现一个菜单,有三个按钮replay.resume.Mainmenu.这个菜单用另一个surfaceview完成,怎样切换,以及传递数据

Android NDK中socket的用法以及注意事项分析_Android

Android NDK中使用socket的整个过程分为以下几部分:第一部分: 创建socket并绑定IP和端口 复制代码 代码如下: #include <sys/select.h>#include <sys/socket.h>#include <arpa/inet.h>#define MAX_DATA_BUF_LEN 10240int sd = INVALID_SOCKET;sockaddr_in addr_org;  // 发送端地址sd = socket(AF_IN

Android NDK中socket的用法以及注意事项分析

Android NDK中使用socket的整个过程分为以下几部分: 第一部分: 创建socket并绑定IP和端口 复制代码 代码如下: #include <sys/select.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAX_DATA_BUF_LEN 10240 int sd = INVALID_SOCKET; sockaddr_in addr_org;  // 发送端地址 sd = socke

android SDk中常用的java包介绍_Android

下面是android SDK中API中的主要java包的功能简介:  复制代码 代码如下: android.app :提供高层的程序模型.提供基本的运行环境android.content :包含各种的对设备上的数据进行访问和发布的类android.database :通过内容提供者浏览和操作数据库android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.android.location :定位和相关服务的类android.media :提供一些类

android SDk中常用的java包介绍

下面是android SDK中API中的主要java包的功能简介: 复制代码 代码如下:android.app :提供高层的程序模型.提供基本的运行环境android.content :包含各种的对设备上的数据进行访问和发布的类android.database :通过内容提供者浏览和操作数据库android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.android.location :定位和相关服务的类android.media :提供一些类管理

格式-关于Android项目中不同包之间的类相互调用

问题描述 关于Android项目中不同包之间的类相互调用 在同一个项目中我创建了几个包,然后在包 com.g.zxing.client.android中创建了类文件数据库MySQLiteOpenHelper我想在包com.g.zxing.client.android.result中的TextResultHandler.java调用MySQLiteOpenHelper格式如下import com.g.zxing.client.android.MySQLiteOpenHelper; public M

Android NDK调用第三方库文件及找不到第三方库解决方案

如何在Android NDK中调用第三方库文件(.so) 1.在project/jni目录下创建prebuilt子目录(目录名可自定义). 2.将第三方.so放到prebuilt中,并创建Android.mk, 内容如下:     LOCAL_PATH := $(call my-dir)     include $(CLEAR_VARS)     LOCAL_MODULE := xxx     LOCAL_SRC_FILES := libxxx.so     include $(PREBUILT

java项目之间怎么互相调用接口

问题描述 java项目之间怎么互相调用接口 一个工程有两个项目 并且都在本地 我要怎么在A项目中调用B项目的接口 求大神们帮忙 解决方案 @Test public void post(){ //创建默认的Httpclient实例 CloseableHttpClient httpclient = HttpClients.createDefault(); //创建post请求 HttpPost post = new HttpPost("你的controller地址"); //创建参数队列

Android Studio中使用apt

一.前言 你还在对着枯燥的重复代码一味复制粘贴吗?这样跟搬砖有何区别?你是否曾想过:你用代码编写出一个自动化的APP,但为何代码本身却缺少了活力?掌握Android-apt,杜绝重复代码,让你写代码如写诗般优雅. 二.何为apt? apt意为:annotation processing tool(注解处理工具),这家伙可神奇了,它能通过注解,在编译期自动生成特定的Java文件,实现自动编写代码. 问:有什么用?凭我自己本事能写出来的代码,为什么要自动化? 大哥,你这是又想施展你的复制粘贴大法了吗