关闭

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

2122人阅读 评论(0) 收藏 举报
分类:

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

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



1
0
查看评论

NDK基础(java ,c/c++, jni之间的关系及java和c/c++之间的相互调用)

1.java,c/c++,和jni之间的关系 java和c/c++可以相互调用,是因为java虚拟机中的JNI。简单的说就是用c/c++编写一个动态链接库让Java虚拟机去调用。(在windows环境下动态链接库就是.dll文件, 在Linux下就是.so文件) 2.下面来看一个具体的例子
  • lishihaojie
  • lishihaojie
  • 2015-05-28 09:27
  • 963

android与NDK层互相调用类方法

曾几何时,我接触到了android,
  • WACR2008
  • WACR2008
  • 2014-09-05 12:38
  • 1386

Java与C互相调用实例详解

一、概述       对于大部分应用开发者来说可能都不怎么接触到NDK,但如果涉及到硬件操作的话就不得不使用NDK了。使用NDK还有另一个原因,就是C/C++的效率比较高,因此我们可以把一些耗时的操作放在NDK中实现。       关于...
  • hbzh2008
  • hbzh2008
  • 2012-04-20 16:29
  • 1806

Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用

Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
  • u014702653
  • u014702653
  • 2017-05-04 20:17
  • 744

android的ndk下,解决两个so相互调用的问题

A、B两个模块,主要都是用C实现的,需要用ndk编译成两个a.so、b.so,但是a.so内调用b.so中的函数,b.so内也调用了a.so中的函数,而且由于某些原因A、B必须分开编译。问题是无论先编译那个模块都会编译不通过,因为它们相互依赖。 为了编译通过,必须在编译
  • victoryckl
  • victoryckl
  • 2011-09-29 00:48
  • 7037

Android JNI之Java和C互相调用

概述JNI是什么JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK是什么NDK是Native Deve...
  • qq_17250009
  • qq_17250009
  • 2016-11-15 14:56
  • 2015

Android JNI中C和JAVA代码之间的互相调用

一、C语言代码回调Java方法 1. C代码回调Java方法的流程 (1) 找到java对应的Class 创建一个char*数组, 然后使用jni.h中提供的FindClass方法获取jclass返回值; char* classname = "wjy/geridge/com/tes...
  • quan648997767
  • quan648997767
  • 2017-03-23 17:07
  • 1754

Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调

在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用。        Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他...
  • xhf_123
  • xhf_123
  • 2015-12-03 19:58
  • 2548

Android Studio NDK 入门教程(2)--Java与C++之间的简单数据转换与传递

概述本文将讲解Java与原生代码之间的数据转换,包括基础类型之间的转换。
  • venusic
  • venusic
  • 2016-08-16 01:18
  • 3207

python类之间方法互相调用

all.py from son import * class ALL():     def __init__(self):         self.mSon = SON(self)     def get...
  • lovemysea
  • lovemysea
  • 2017-06-20 22:18
  • 2277
    个人资料
    • 访问:4434574次
    • 积分:24230
    • 等级:
    • 排名:第328名
    • 原创:246篇
    • 转载:35篇
    • 译文:8篇
    • 评论:1070条
    博客专栏
    最新评论