Android Ndk中C与JAVA之间的互相调用
投稿于 被查看 19760 次 评论:141
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#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,, ()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; }
用户评论