NDK Java 调用 C代码
来源:互联网 发布:进销存数据库设计 编辑:程序博客网 时间:2024/05/01 15:36
Java 调用 C代码
1、编写接口
package com.lwb.testndk;public class JNI { static { // 静态初始化代码块,这里加载的库名称要和 gradle 中定义的 moduleName 名称一致 System.loadLibrary("LwbLib"); } public static native int add(int var1,int var2); public static native String syHello(String var1); public static native int[] increaseArayEles(int[] var1); public static native int checkPwd(String var1);}
2、命令行javah com.lwb.testndk.JNI 产生头文件com_lwb_testndk_JNI.h
#include <stdio.h>#include <stdlib.h>#include <string.h>/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* 要使用Log则需要引用 android/log.h 这个头文件 */#include <android/log.h>/* 可以根据需要调用不同类型的 LOG */#ifndef LOG_TAG#define LOG_TAG "ANDROID_LOG"#define LOG_E(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG , __VA_ARGS__)#define LOG_I(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG , __VA_ARGS__)#define LOG_W(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG , __VA_ARGS__)#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG , __VA_ARGS__)#endif/* Header for class com_lwb_testndk_JNI */#ifndef _Included_com_lwb_testndk_JNI#define _Included_com_lwb_testndk_JNI#ifdef __cplusplusextern "C" {#endif/* * Class: com_lwb_testndk_JNI * Method: add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_add (JNIEnv *, jobject, jint, jint);/* * Class: com_lwb_testndk_JNI * Method: syHello * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_lwb_testndk_JNI_syHello (JNIEnv *, jobject, jstring);/* * Class: com_lwb_testndk_JNI * Method: increaseArayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles (JNIEnv *, jobject, jintArray);/* * Class: com_lwb_testndk_JNI * Method: checkPwd * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif
3、编写C文件
#include "com_lwb_testndk_JNI.h"/**利用Java的String类来完成字符编码转换*/char* _Jstring2CStr(JNIEnv *env,jstring jstr) { char *rtn = NULL; jclass clsstring = (*env)->FindClass(env, "java/lang/String"); jstring strencode = (*env)->NewStringUTF(env, "GB2312");//转换成Cstring的GB2312,兼容ISO8859-1 jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(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); memcpy(rtn, ba, alen); rtn[alen] = 0; //"\0" } (*env)->ReleaseByteArrayElements(env, barr, ba, 0); return rtn;};/* * Class: com_lwb_testndk_JNI * Method: add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_add (JNIEnv *env, jobject jobject, jint ji, jint jj) { int result = ji + jj; return result;};/* * */JNIEXPORT jstring JNICALL Java_com_lwb_testndk_JNI_syHello (JNIEnv *env, jobject jobject, jstring jstr) { LOG_I ("log 类型 _I 000000 ");// char* fromJava = _Jstring2CStr(env, jstr); //c: char* fromJava = (char *) malloc(100 ); fromJava = " I am fromJava"; char* fromc = "add I am from c";// strcat(fromJava, fromc);//把拼接的结果放在第一个参数 LOG_I ("log 类型 _I 222222222222"); return (*env)->NewStringUTF(env, fromc);};/* 每个数加10 * Class: com_lwb_testndk_JNI * Method: increaseArayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles (JNIEnv *env, jobject jobject, jintArray jintArray){ //数组的长度 int len = (*env)->GetArrayLength(env,jintArray); LOG_I ("len = %d " ,len); int i ; jint* var = (*env)->GetIntArrayElements(env,jintArray,JNI_FALSE); for(int i=0;i<len;i++){ *(var + i) = *(var + i) + 10; LOG_I ("var = %d " , *(var + i)); } return jintArray;};JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd (JNIEnv * env, jobject jobj, jstring jstr){ char* orgin = "123456"; char* fromUser = "1234567";// char* fromUser = _Jstring2CStr(env, jstr); int code = strcmp(orgin,fromUser); if(code ==0 ){ return 200; }else{ return 400; }};
4、测试
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.text);// textView.setText(GetString.getNativeStr()); textView.setText(new GetString().getNativeStr());// TextView textView2 =(TextView)findViewById(R.id.text2);// textView2.setText(GetString2.getNativeStr2()); } public void add(View view) { int result = JNI.add(55, 66); Log.i(TAG, "add: result = " + result); } public void syHello(View view) { String result = JNI.syHello("from java"); Log.i(TAG, "syHello: result = " + result); } public void increaseArayEles(View view) { int[] var1 = new int[10]; for (int i = 0; i < var1.length; i++) { var1[i] = i; } int[] result = JNI.increaseArayEles(var1); for (int i = 0; i < result.length; i++) { Log.i(TAG, "syHello: result = " + result[i]); } } public void checkPwd(View view) { int result = JNI.checkPwd("123456"); Log.i(TAG, "syHello: result = " + result); }}
0 0
- NDK Java 调用 C代码
- NDK技术,Java项目调用C代码
- Android NDK c调用java代码
- android ndk c代码调用java的代码
- NDK:android调用c代码
- ndk开发中,在c中调用java代码
- Android NDK学习记录(二):C/C++调用Java代码
- NDK 开发C中通过反射调用Java代码
- NDK开发c调用java代码(四)
- AndroidStudio NDK开发 c环境调用java代码
- NDK 之 C调用Java
- ndk c调用java函数
- ndk c调用java函数
- ndk c调用java函数
- NDK 之 C调用Java
- NDK 之 C调用Java
- android NDK--C 调用java
- Android NDK (学习笔记八) —— Java代码与C代码间方法的调用
- 分享一个国内 maven 镜像
- book
- Kerberos与Ranger、KMS整合
- 创建和使用动态链接库
- test_1059_投篮比赛
- NDK Java 调用 C代码
- 【HDFS】hadoop2.x HDFS javaAPI
- Android 自定义加载框
- OC当中的深拷贝和浅拷贝
- 圈子金融的weex领悟 - weex-start
- Analysis of 【Dropout】
- java虚拟机
- 【mapreduce】hadoop2.x—mapreduce实战和总结
- Java高并发,如何解决,什么方式解决