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



目录
相关文章
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
110 1
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
164 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
3月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
68 1
|
3月前
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
422 1
|
3月前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
33 2
|
3月前
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
180 1
|
3月前
|
IDE Java Linux
探索安卓开发:从基础到进阶的旅程Java中的异常处理:从基础到高级
【8月更文挑战第30天】在这个数字时代,移动应用已经成为我们日常生活中不可或缺的一部分。安卓系统由于其开放性和灵活性,成为了开发者的首选平台之一。本文将带领读者踏上一段从零开始的安卓开发之旅,通过深入浅出的方式介绍安卓开发的基础知识、核心概念以及进阶技巧。我们将一起构建一个简单的安卓应用,并探讨如何优化代码以提高性能和应用的用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和启发。
|
7天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。