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开发
解决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
134 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
21天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
23天前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
39 1
|
1月前
|
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
95 1
|
1月前
|
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
18 2
|
1月前
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
98 1
|
21天前
|
IDE Java Linux
探索安卓开发:从基础到进阶的旅程Java中的异常处理:从基础到高级
【8月更文挑战第30天】在这个数字时代,移动应用已经成为我们日常生活中不可或缺的一部分。安卓系统由于其开放性和灵活性,成为了开发者的首选平台之一。本文将带领读者踏上一段从零开始的安卓开发之旅,通过深入浅出的方式介绍安卓开发的基础知识、核心概念以及进阶技巧。我们将一起构建一个简单的安卓应用,并探讨如何优化代码以提高性能和应用的用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和启发。
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
92 4
|
5天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
16天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解