本例实现一个简单的场景:
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