android jni c 调java_android JNI简单的java调C

1、Android工程里创建一类(定义要用的native方法):

public class DataProvider {

public native int add(int x,int y);

public native String sayHello(String str);

public native int[] intMethod(int[] num);

} 2、用Javah进行编译,生成cn_uc_DataProvider.h文件 3、将该文件放在jni文件夹里,并创建Android.mk(要添加log 库): LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE    := hello LOCAL_SRC_FILES := hello.c #增加 log 函数对应的log 库  liblog.so LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY) 4、在该文件夹中创建hello.c文件(记得导入log头文件): #include "cn_uc_DataProvider.h" #include #include #define LOG_TAG "XIAOYUAN" #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_cn_uc_DataProvider_add(JNIEnv * env, jobject obj, jint x, jint y) { LOGI("x=%ld",x); LOGI("t=%ld",y); return x + y; } JNIEXPORT jstring JNICALL Java_cn_uc_DataProvider_sayHello(JNIEnv * env, jobject obj, jstring str) { char* p = Jstring2CStr(env, str); LOGI("%s",p); char* newStr = "yuan"; //strcat(dest, sorce) 把sorce字符串添加到dest字符串的后面 LOGI("END"); return (*env)->NewStringUTF(env, strcat(p, newStr)); } JNIEXPORT jintArray JNICALL Java_cn_uc_DataProvider_intMethod(JNIEnv * env, jobject obj, jintArray arr) { // 1.获取到 arr的大小 int len = (*env)->GetArrayLength(env, arr); LOGI("len=%d", len);  if(len==0){ return arr;    }    jint* p = (*env)-> GetIntArrayElements(env,arr,0);    int i=0;    for(;iFindClass(env, "java/lang/String"); jstring strencode = (*env)->NewStringUTF(env, "GB2312"); jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes","(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid,strencode); // String .getByte("GB2312"); jsize alen = (*env)->GetArrayLength(env, barr); jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE); if (alen > 0) { rtn = (char*) malloc(alen + 1); //new   char[alen+1]; "\0" memcpy(rtn, ba, alen); rtn[alen] = 0; } (*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放内存 return rtn; } 注意:发现问题: /** $ ndk-build Compile thumb  : hello <= hello.c D:/Program/Demo/jni/hello.c: In function 'Java_cn_uc_DataProvider_sayHello': D:/Program/Demo/jni/hello.c:18: warning: initialization makes pointer from integ er without a cast D:/Program/Demo/jni/hello.c: At top level: D:/Program/Demo/jni/hello.c:46: error: conflicting types for 'Jstring2CStr' D:/Program/Demo/jni/hello.c:18: note: previous implicit declaration of 'Jstring2 CStr' was here make: *** [/cygdrive/d/Program/Demo/obj/local/armeabi/objs/hello/hello.o] Error 1 */ 5、用Cygwin进行编译...... 6、在Activity中调用DataProvider中的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值