今天把前面几天做的那个demo5重新做了一下,TMD,不敢粗心大意.
我按照其他资料上介绍的,做了一个测试C语言回调java的操作:
<1> : 在demo5的基础上新建一个dataprovider.java类,calladd在C语言层调用add函数,然后返回:
package com.example.hellojnidemo5; public class dataprovider { public native int calladd(); public int add(int x,int y){ return x+y; } }
<2> : 进到./bin/classes目录下,javah com.example.hellojnidemo5.dataprovider,即可以在该目录下生成.h的头文件,修改文件名成dataprovider.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_hellojnidemo5_dataprovider */ #ifndef _Included_com_example_hellojnidemo5_dataprovider #define _Included_com_example_hellojnidemo5_dataprovider #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_hellojnidemo5_dataprovider * Method: calladd * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_example_hellojnidemo5_dataprovider_calladd (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
<2> : 根据头文件在编写C语言部分:
#include"dataprovider.h" #include<jni.h> #include<string.h> #include<android/log.h> //修改日志tag中的值 #define LOG_TAG "logfromc" //日志显示的等级 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) JNIEXPORT jint JNICALL Java_com_example_hellojnidemo5_dataprovider_calladd(JNIEnv *env,jobject obj){ char* classname="com/example/hellojnidemo5/dataprovider"; jclass classstr=(*env)->FindClass(env,classname); if(classstr==0){ return; }else{ } jmethodID java_method=(*env)->GetMethodID(env,classstr,"add","(II)I"); if(java_method==0){ }else{ } jint result=(*env)->CallIntMethod(env,obj,java_method,5,8); LOGI("C result : %d",result); return result; }
启动cgywin,到工程目录下: $NDK/ndk-build
<3>在主工程添加一个按钮事件:
mMsgBtn=(Button)findViewById(R.id.button3); mMsgBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "result : " + dp.calladd(), Toast.LENGTH_SHORT).show(); } });
<4> 即可以运行得到 13;
为什么还纠正这个demo : 我发觉前面几次似乎运行结果不怎么对,而且重要的是日志没有打印,前面哥哥以为是模拟器的问题,今天看了看,发现不是,而是liblog.so路径设置有问题.
正确的Android.mk配置如下:注意字段 : LOCAL_LDLIBS
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jnilibs LOCAL_SRC_FILES := javatoc.c LOCAL_SRC_FILES := javatc.c #add log libaray liblog.so libthread_db.a LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib -llog include $(BUILD_SHARED_LIBRARY)
即可以运行出结果,IE10无法贴图.