精华内容
下载资源
问答
  • Android NDK Java 调用C

    2011-09-26 18:19:23
    Android NDK Java 调用C~~~~~~~~~~~~~
  • android NDK(java调用C)

    2016-11-15 09:54:35
    java调用C的方法 相关博客http://blog.csdn.net/lang523493505/article/details/53163679
  • Java调用NDK代码

    2020-11-20 19:12:17
    (1)说明:最近想玩一下ndk的使用,首先在Android studio里面安装ndk,教程自己去搜索,然后创建一个支持C/C++的新的android项目,然后在native-lib.cpp文件里面,写c语言代码,然后调用就ok, 包括功能:文字展示...

    (1)说明:最近想玩一下ndk的使用,首先在Android studio里面安装ndk,教程自己去搜索,然后创建一个支持C/C++的新的android项目,然后在native-lib.cpp文件里面,写c语言代码,然后调用就ok,

    包括功能:文字展示,两个数求和,两个数相乘,两个数对比大小,冒泡排序算法,最大公约数和最小公倍数,

    其中,所有功能均由C语言代码实现,java层只是负责调用,非常的简单方便,一定要注意包名和方法名保持一致,不然会报错,无法运行

    (2) CMakeLists.txt 不用动,保持原样

    (3)native-lib.cpp  用C语言实现功能

    #include <jni.h>
    #include <string>
    
    
    extern "C"
    JNIEXPORT jlong JNICALL
    Java_com_example_c_MainActivity_getAdd(JNIEnv *rnv, jobject thiz, jint width, jint height) {
        return (width + height);
    }
    
    extern "C"
    JNIEXPORT jlong JNICALL
    Java_com_example_c_MainActivity_getMult(JNIEnv *rnv, jobject thiz, jint width, jint height) {
        return (width * height);
    }
    
    //最大公约数
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_c_MainActivity_getMax(JNIEnv *rnv, jobject thiz, jint width, jint height) {
        int gcd = 0;
        for (int i = 1; i <= width && i <= height; ++i) {
            if (width % i == 0 && height % i == 0)
                gcd = i;
        }
        return gcd;
    }
    
    //最小公倍数
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_c_MainActivity_getMin(JNIEnv *rnv, jobject thiz, jint width, jint height) {
        int minMultiple = 0;
        minMultiple = (width > height) ? width : height;
        while (1) {
            if (minMultiple % width == 0 && minMultiple % height == 0) {
                break;
            }
            ++minMultiple;
        }
        return minMultiple;
    }
    
    int com(const void *a, const void *b) {
        return *(int *) a - *(int *) b;//升序
    }
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_example_c_MainActivity_passArrayMethod(JNIEnv *env, jobject jobj, jintArray jarr) {
        //1.获取数组指针
        jint *arr = env->GetIntArrayElements(jarr, NULL);
        *arr = 100;
        //2.获取数组长度
        int len = env->GetArrayLength(jarr);
        //3.排序
        qsort(arr, len, sizeof(jint), com);
        //4.释放资源
        env->ReleaseIntArrayElements(jarr, arr, JNI_COMMIT);
    }
    
    extern "C"
    JNIEXPORT jintArray JNICALL
    Java_com_example_c_MainActivity_createArrayMethod
            (JNIEnv *env, jobject jobj, jint len) {
        //1.新建长度len数组
        jintArray jarr = env->NewIntArray(len);
        //2.获取数组指针
        jint *arr = env->GetIntArrayElements(jarr, NULL);
        //3.赋值
        int i = 0;
        for (; i < len; i++) {
            arr[i] = i;
        }
        //4.释放资源
        env->ReleaseIntArrayElements(jarr, arr, 0);
        //5.返回数组
        return jarr;
    };
    
    
    extern "C"
    JNIEXPORT jlong JNICALL
    Java_com_example_c_MainActivity_getCompare(JNIEnv *rnv, jobject thiz, jint width, jint height) {
        long a;
        if (width > height) {
            a = width;
        } else {
            a = height;
        }
        return a;
    }
    
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_example_c_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "what are you doing C++";
        return env->NewStringUTF(hello.c_str());
    
    }
    
    
    
    

     

    (4)主界面java

    package com.example.c;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity {
        private TextView tv_add, tv, tv_mult, tv_compare, tv_max, tv_min;
        private Button btn_add, btn_mult, btn_compare, btn_sort, btn_min, btn_max;
        private EditText et_add1, et_add2, et_mult1, et_mult2, et_compare1, et_compare2, et_max1, et_max2, et_min1, et_min2;
    
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tv = findViewById(R.id.sample_text);
            tv_add = findViewById(R.id.tv_add);
            tv_mult = findViewById(R.id.tv_mult);
            tv_compare = findViewById(R.id.tv_compare);
            tv_max = findViewById(R.id.tv_max);
            tv_min = findViewById(R.id.tv_min);
    
            btn_add = findViewById(R.id.btn_add);
            btn_mult = findViewById(R.id.btn_mult);
            btn_sort = findViewById(R.id.btn_sort);
            btn_compare = findViewById(R.id.btn_compare);
            btn_min = findViewById(R.id.btn_min);
            btn_max = findViewById(R.id.btn_max);
    
            et_add1 = findViewById(R.id.et_add1);
            et_add2 = findViewById(R.id.et_add2);
            et_mult1 = findViewById(R.id.et_mult1);
            et_mult2 = findViewById(R.id.et_mult2);
            et_compare1 = findViewById(R.id.et_compare1);
            et_compare2 = findViewById(R.id.et_compare2);
            et_max1 = findViewById(R.id.et_max1);
            et_max2 = findViewById(R.id.et_max2);
            et_min1 = findViewById(R.id.et_min1);
            et_min2 = findViewById(R.id.et_min2);
    
            tv.setText(stringFromJNI());
    
            btn_add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv_add.setText(String.valueOf(getAdd(Integer.parseInt(et_add1.getText().toString()),
                            Integer.parseInt(et_add2.getText().toString()))));
                }
            });
    
            btn_mult.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv_mult.setText(String.valueOf(getMult(Integer.parseInt(et_mult1.getText().toString()),
                            Integer.parseInt(et_mult2.getText().toString()))));
                }
            });
            btn_compare.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv_compare.setText(String.valueOf(getCompare(Integer.parseInt(et_compare1.getText().toString()),
                            Integer.parseInt(et_compare2.getText().toString()))));
                }
            });
    
            btn_sort.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int[] arr = {89, 38, 11, 78, 96, 44, 19, 25};
                    Log.e("TAG", "arr修改前: " + Arrays.toString(arr));
                    passArrayMethod(arr);
                    Log.e("TAG", "arr修改后: " + Arrays.toString(arr));
                    Log.e("TAG", "------------------------------------------");
                    int[] arr_new = createArrayMethod(10);
                    Log.e("TAG", "arr_new: " + Arrays.toString(arr_new));
                }
            });
    
            btn_max.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv_max.setText(String.valueOf(getMax(Integer.parseInt(et_max1.getText().toString()),
                            Integer.parseInt(et_max2.getText().toString()))));
                }
            });
    
            btn_min.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv_min.setText(String.valueOf(getMin(Integer.parseInt(et_min1.getText().toString()),
                            Integer.parseInt(et_min2.getText().toString()))));
                }
            });
        }
    
        //两数相加
        public native long getAdd(int width, int height);
    
        //两数相乘
        public native long getMult(int width, int height);
    
        //两个数比大小
        public native long getCompare(int width, int height);
    
        //显示简单的text
        public native String stringFromJNI();
    
        //传递数组给JNI,修改第一个元素值,然后排序
        public native void passArrayMethod(int[] arr);
    
        //创建指定长度数组,并返回
        public native int[] createArrayMethod(int len);
    
        //最大公约数
        public native int getMax(int width, int height);
    
        //最小公倍数
        public native int getMin(int width, int height);
    
    }

    布局页面,然后运行就ok

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/sample_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:textColor="@android:color/holo_red_dark"
            android:textSize="30sp" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
            <EditText
                android:id="@+id/et_add1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <EditText
                android:id="@+id/et_add2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <Button
                android:id="@+id/btn_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="加法" />
    
            <TextView
                android:id="@+id/tv_add"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="@android:color/black"
                android:textSize="38sp" />
    
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
            <EditText
                android:id="@+id/et_mult1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <EditText
                android:id="@+id/et_mult2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <Button
                android:id="@+id/btn_mult"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="乘法" />
    
            <TextView
                android:id="@+id/tv_mult"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="@android:color/black"
                android:textSize="38sp" />
    
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
            <EditText
                android:id="@+id/et_compare1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <EditText
                android:id="@+id/et_compare2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <Button
                android:id="@+id/btn_compare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="对比大小" />
    
            <TextView
                android:id="@+id/tv_compare"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="@android:color/black"
                android:textSize="38sp" />
    
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btn_sort"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="冒泡排序算法" />
        </LinearLayout>
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
    
            <EditText
                android:id="@+id/et_max1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <EditText
                android:id="@+id/et_max2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <Button
                android:id="@+id/btn_max"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="最大公约数" />
    
            <TextView
                android:id="@+id/tv_max"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="@android:color/black"
                android:textSize="38sp" />
    
    
        </LinearLayout>
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">
    
    
            <EditText
                android:id="@+id/et_min1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <EditText
                android:id="@+id/et_min2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:hint="请输入值" />
    
            <Button
                android:id="@+id/btn_min"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="最小公倍数" />
    
            <TextView
                android:id="@+id/tv_min"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="@android:color/black"
                android:textSize="38sp" />
        </LinearLayout>
    
    </LinearLayout>

    end

    展开全文
  • NDKjava调用C方法

    2015-12-22 10:30:57
    在这里NDK通过JNI调用c通常有两种方法,一种就是用javah编译出java的native方法,之后在c实现,另一种就是用RegisterNatives方法进行native方法的注册,再调用。。 鉴于代码好管理和方便查看我就采用第二种方法一、...

    在这里NDK通过JNI调用c通常有两种方法,一种就是用javah编译出java的native方法,之后在c实现,另一种就是用RegisterNatives方法进行native方法的注册,再调用。。
    鉴于代码好管理和方便查看我就采用第二种方法

    一、我先在java端写native方法,再将动态链接库加载到程序中

    public class UUIDNDK
    {
    static
    {
    System.loadLibrary("UUIDDemo");
    }
    public native String getUUID();
    }

    二、在c端先会将native方法放入一个JNINativeMethod映射数组里面

    static JNINativeMethod gMethods[] = { { "getUUID", "()Ljava/lang/String;",(void*) getUUID }, };

    a.”getUUID”是java端的native方法.
    b.”()Ljava/lang/String;”是java端native代码参数和返回值的描述
    c.(void *)getUUID就是c端的实现函数.

    三、再重写JNI_OnLoad函数,当java端执行System.loadlibrary()时就会执行JNI_OnLoad()函数

    jint JNI_OnLoad(JavaVM* vm, void* reserved) {
        JNIEnv* env = NULL;
        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
            LOGE("GetEnv failed");
            return JNI_ERR;
        }
    //注册本地方法
        if (registerNativeMethods(env, CLASS_PATH_NAME, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) != JNI_TRUE) {
        LOGE("ERROR: registerNatives failed");
        return JNI_ERR;
        }
        return JNI_VERSION_1_4;
    }
    static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods)
    {
        jclass clazz;
        clazz = env->FindClass(className);
        if (clazz == NULL) {
            LOGE("Native registration unable to find class '%s'", className);
            return JNI_FALSE;
        }
        if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
            LOGE("RegisterNatives failed for '%s'", className);
            env->DeleteLocalRef(clazz);
            return JNI_FALSE;
        }
        env->DeleteLocalRef(clazz);
        return JNI_TRUE;
    }

    四、而当VM释放该C组件时,则会呼叫JNI_OnUnload()函数来进行善后清除动作

    void JNI_OnUnload(JavaVM* vm, void* reserved)
    {
        LOGI("JNI_OnUnLoad!");
        JNIEnv *env;
        jclass cls;
        clearMemery();//释放程序中申请的内存
        if (vm->GetEnv((void **) &env, JNI_VERSION_1_4))
            return;
        cls = env->FindClass(CLASS_PATH_NAME);
        env->UnregisterNatives(cls);
        return;
    }

    五、编写和java native方法对应C端的函数

    jstring getUUID(JNIEnv *env, jclass thiz) {
        LOGI("getUUID......");
        return converchartojstring(env, "");
    }

    六、完成

    展开全文
  • NDK Java 调用 C代码

    2017-02-06 18:24:40
    Java 调用 C代码 1、编写接口 package com.lwb.testndk; public class JNI { static { // 静态初始化代码块,这里加载的库名称要和 gradle 中定义的 moduleName 名称一致 System.loadLibrary("LwbLib"); ...

     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 __cplusplus
    extern "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);
    
        }
    
    
    }
    


    展开全文
  • 1.写native代码用于调用c代码,在java中写 public class JNI {  static {  System.loadLibrary("Test");  }  /*  * 定义native方法  * 调用c代码对应的方法  * */ /* * 让c代码做加法运算 把结果返回给...
    java调c
    1.写native代码用于调用c代码,在java中写
    public class JNI {
        static {
            System.loadLibrary("Test");
        }
        /*
        * 定义native方法
        * 调用c代码对应的方法
        * */
     /*
     * 让c代码做加法运算 把结果返回给java
     *
     * */
     public native int add(int x,int y);
     /*
     * 从java传入字符串,c代码进行拼接
     *
     * s I am from java
     * I am from java I am from c
     * */
     public native String sayHello(String s);
     /*
     * 让c代码给每个元素都加上十
     * */
     public native int[] increaseArrayEles(int[] intArray);
    /* *
    * 应用:检查密码是否正确 如果正确 返回200 否则返回400
    * */
     public native int checkPwd(String pwd);
    }
    2.编译动态链接库,什么也不配置,编译的动态链接库是以当前的module名称为库名称
    lib+modulename+.so
    最好是配置动态链接库的名称,在build.gradle中
     defaultConfig {
            applicationId "www.basketi.cn.basketball.ccalljavademo"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
            ndk{
                moduleName ("Test");
                abiFilters "armeabi", "armeabi-v7a", "x86"
            }
            ndk{
                ldLibs "log"
            }
        }
    3.加载动态链接库
     static {
    //加载动态链接库
            System.loadLibrary("Test");
        }
    4.写对应的c代码
     java中native去调用c代码
     给含有native方法的类生成头文件,如JNI类,然后根据头文件中的方法,写对应的c代码

    c代码
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include "www_basketi_cn_basketball_javacallcdemo_JNI.h"
    #include<jni.h>
    #include<stdio.h>
    #include <stdlib.h>
    #include<string.h>
    char* _jstringToChar(JNIEnv* env, jstring jstr)
    {
        char* rtn = NULL;
        jclass clsstring = (*env)->FindClass(env,"java/lang/String");
        jstring strencode = (*env)->NewStringUTF(env,"UTF-8");
        jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
        jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
        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];
            memcpy(rtn,ba,alen);
            rtn[alen]=0;
        }
        (*env)->ReleaseByteArrayElements(env,barr,ba,0);
    
        return rtn;
    }
    /*
    jint 返回值
    Java_www_basketi_cn_basketball_javacallcdemo_JNI 全类名_方法名
    */
     jint  Java_www_basketi_cn_basketball_javacallcdemo_JNI_add
      (JNIEnv *evn, jobject jobject, jint ji, jint jj){
        int result=ji+jj;
            return result;
      };
        jstring Java_www_basketi_cn_basketball_javacallcdemo_JNI_sayHello
            (JNIEnv * env, jobject jt, jstring js){
            //c:  将jstring 转换为char类型
            char* fromJava=_jstringToChar(env,js);
            char* fromC="add I am from C";
            //拼接函数
               strcat(fromJava,fromC);//把拼接的结果放在第一个参数里面
                //将char类型转换成jstring
                return (*env)->NewStringUTF(env,fromJava);
    //return "";
         };
    /**
    *给每个元素加上十
    */
    jintArray Java_www_basketi_cn_basketball_javacallcdemo_JNI_increaseArrayEles
      (JNIEnv * env, jobject jb, jintArray jintArray){
            //1 得到数组长度
            jsize size=(*env)->GetArrayLength(env,jintArray);
            //2.得到数组元素
            jint* ja=(*env)->GetIntArrayElements(env,jintArray,JNI_FALSE);
            //3.遍历数组 给每个元素加上10
            int i;
            for(i=0;i<size;i++){
                *(ja+i)+=10;
    
            }
    
            //4 返回结果
            return jintArray;
      };
    JNIEXPORT jint JNICALL Java_www_basketi_cn_basketball_javacallcdemo_JNI_checkPwd
      (JNIEnv *env, jobject jobject, jstring jstring){
    
        //假设服务器的密码123456
        char* origin="123456";
        char* user=_jstringToChar(env,jstring);
        //函数 比较字符串是否相同
        int code =strcmp(origin,user);
        if(code==0){
            return 200;
        }else{
            return 400;
        }
      };
    5.执行java调用c的代码
     
    jni=new JNI();
    ((Button) findViewById(R.id.jcc)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            jni.add(991,1);
            Log.i("add---",jni.add(991,1)+"");
        }
    });
    ((Button) findViewById(R.id.jcc2)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String result=jni.sayHello("i am from java");
            Log.i("javacllc----",result);
        }
    });
    ((Button) findViewById(R.id.jcc3)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int array[]={1,2,3};
            int[] cArray=jni.increaseArrayEles(array);
            for (int i=0;i<cArray.length;i++){
                Log.i("-cArray---",cArray[i]+"");
            }
        }
    });
    ((Button) findViewById(R.id.checkpwd)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int result=jni.checkPwd("123456");
            Log.i("-检验结果result---",result+"");
        }
    });
    源码地址:http://download.csdn.net/detail/lzq520210/9733500
    展开全文
  • 之前文章讲解过有关JNI和NDK开发的基本...一、Java调用C函数 public native int sum(int x, int y); public native String sayHello(String s); public native int[] increaseArrayEles(int[] intArray); /* * ...
  • ndk jni java调用c

    2012-11-14 13:30:14
    java类方法对应的C函数签名  函数签名格式如下:  JNIEXPORT 返回类型 JNICALL JAVA_包名(分割用下划线)_类名_方法名(JNIEnv* env,jobject thiz); 写Android.mk生成一个so库。 在java类的静态块中中用Syst....
  • 在Android Studio3.3版本后 ,我们直接就可以调用C语言 如图: 定义方法: 方法内写C就ok了
  • JNI/NDK Java调用C/C++前言  通过第一篇文章,我们了解了AndroidStudio+CMake 进行JNI/NDK开发的环境搭建,第二篇文章讲解生成了一个简单的so库文件的流程。那么在实际的开发过程中我们往往要进行两层之间的调用如...
  • NDKJAVAC互相调用

    2013-04-07 15:38:29
    JAVA调用C, C调用JAVA创建一个按钮 这个按钮点击后,又调用一个C函数 改编自NDK例子
  • Android调用C类库
  • 首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解!  关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只要配置好能编译...
  • Android.mk代码: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS := -lm -llog  LOCAL_MODULE := myndk ...LOCAL_SRC_FILES := myndk.c include $(BUILD_SHARED_LIBRARY) mynd
  • 在上一篇博客 JNI与NDK开发(二)——JNI基本概念 与 Java对C或C++函数的简单调用 我们介绍了 Java调用C的基本方法,这种方法虽然足够简单,但是写法太死板,多个Native方法时,大量基础代码重复。 Android 和 JNI...
  • Java调用C

    2020-10-12 14:53:39
    Java调用C++/C有3中方式:JNI、JNA、JNative。 注:1、个人觉得还是JNA的方式最好。 2、Java和C++/C交互的难点在于数据结构的对应 3、java不可以直接调用C#...7、在Activity调用(Java调用C/C++)。 JNative 使用步骤:
  • java调用c/c++过程 1. 已采用ndk编译出c/c++库(c_libname.a/ c_libname so),根据c_libname.h编写对应的java类; 2. 根据native java类,编译出对应的cpp文件头;如下面例子:  a) 使用Java工具Javah可以很...
  • 首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解!      关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只要配置好...
  • NDK_C调用java demo

    2015-09-24 14:53:45
    NDK中使用C代码调用java中的方法事例demo
  • 长话短说,java为了调用c库,需要用到JNI(JAVA本地调用)。见百度百科的介绍:JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它...
  • 上篇文章中已经介绍了,关于NDK开发环境的搭建,这里不做赘述。这篇文章主要是通过一个例子来说明如何通过eclispe自动生成.h头文件,适合初学者。本篇文章主要是参考:...
  • 成功实现C/C++调用Java (Android NDK 开发) 2011-05-30 00:50:09| 分类: iPad iMac 开发 |字号 订阅用C/C++调用Javajava 里面写一个弹出信息对话框 messagebox 是静态函数 , c++里面去调用调用静态函数...
  • 3 下载android ndk 4 下载jdk 5 下载android sdk 下载完毕后配置相应路径,环境变量 完成后 创建android 项目,项目结构如下 创建jni文件夹,目录和src平级 右击项目Properties,选择Builders-》new-》Program ...
  • 转战Android之NDK(jni, java调用c/c++)

    千次阅读 2012-08-12 16:12:54
    java调用c/c++过程 1. 已采用ndk编译出c/c++库(c_libname.a/ c_libname so),根据c_libname.h编写对应的java类; 2. 根据native java类,编译出对应的cpp文件头;如下面例子:  a) 使用Java工具Javah可以很...
  • NDK Java 调用 C/C++ (二)

    2013-06-18 23:32:34
    1.在Java类中声明一个native方法 2.使用javah 命令生成包含 native 方法类的 c/c++头文件(不喜欢生成后的头文件名,自己改下吧) 生成后H文件如下(这里将com_open_jni_Test.h改为了Test.h): 3.按照C/C++定义的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,909
精华内容 763
关键字:

java调用cndk

java 订阅