jni——C语言小示例

之前做一些东西,做完之后发现发现还要做一个接口给Andirod那边去调用。

虽然开始觉得这个我不是做Andriod的没有必要去弄,但是后来发现,有些东西还是自己弄会更快更好。这里是删减了中间的东西,然后存储是输入输出或者以形参的形式传递值的一些方法的记录。

	public native int Method_revc(Test_Ret retobj);//通过形参返回字符串
        public native int intMethod(int n);//传入int型返回int型
        public native boolean booleanMethod(boolean bool);//传入boolean,返回boolean
        public native String stringMethod(String text);//传入字符串,返回字符串
        public native int intArrayMethod(int[] intArray);//传入数组,返回intpublic native int Method_revc(Test_Ret retobj);//通过形参返回字符串
        public native int intMethod(int n);//传入int型返回int型
        public native boolean booleanMethod(boolean bool);//传入boolean,返回boolean
        public native String stringMethod(String text);//传入字符串,返回字符串
        public native int intArrayMethod(int[] intArray);//传入数组,返回int

调用这些函数的示例:

//get the string not by return
                int ret = test.Method_revc(retobj);
                String str = new String (retobj.bytearray);
                System.out.println("Method_revc:"+str);

                //other function test
                int ret_i = test.intMethod(5);
                System.out.println("intMethod:"+ret_i);

                boolean ret_bool = test.booleanMethod(true);
                System.out.println("booleanMethod: " + ret_bool);

                String ret_s = test.stringMethod("Yukin");
                System.out.println("stringMethod: " + ret_s);

                int ret_ia = test.intArrayMethod(new int[] { 1, 1, 2, 3, 5, 8, 13 });
                System.out.println("intArrayMethod: " + ret_ia);

 

编写Test.java文件后,执行javac Test.java ,编译完成后执行javah Test, 生成头文件Test.h

根据Test.h的函数名编写Test.c的内容

 

#include "Test.h"

JNIEXPORT jint JNICALL Java_Test_Method_1revc
(JNIEnv * env, jobject obj, jobject retobj){
        char * str = "hello_Yukin_test";
        char buf[20];
        jclass cls;
        jfieldID fid;
        strcpy(buf,str);
        jbyteArray bytearray = (*env)->NewByteArray(env, 20);
        (*env)->SetByteArrayRegion(env, bytearray, 0, 16, buf);
        cls = (*env)->GetObjectClass(env, retobj);
        if(cls){
                fid = (*env)->GetFieldID(env, cls, "bytearray", "[B");
                if(fid){
                        (*env)->SetObjectField(env, retobj, fid, bytearray);
                }
        }
        (*env)->DeleteLocalRef(env, bytearray);
        return 0;
}
JNIEXPORT jint JNICALL Java_Test_intMethod
(JNIEnv * env, jobject obj, jint num){
        return num * num;
}

JNIEXPORT jboolean JNICALL Java_Test_booleanMethod
(JNIEnv * env, jobject obj, jboolean ret_bool){
        return !ret_bool;
}

JNIEXPORT jstring JNICALL Java_Test_stringMethod
(JNIEnv * env, jobject obj, jstring string){
        const char *str = (*env)->GetStringUTFChars(env, string, 0);
        char cap[10];
        strcpy(cap, str);
        (*env)->ReleaseStringUTFChars(env, string, str);
        return (*env)->NewStringUTF(env, cap);
}

JNIEXPORT jint JNICALL Java_Test_intArrayMethod
(JNIEnv * env, jobject obj, jintArray array){
        int i, sum = 0;
        jsize len = (*env)->GetArrayLength(env, array);
        jint * body = (*env)->GetIntArrayElements(env, array, 0);
        for(i=0; i<len; i++){
                sum += body[i];
                printf("sum[%d]\t",sum);
        }
        (*env)->ReleaseIntArrayElements(env, array, body, 0);
        return sum;
}


编写完成后执行:

 

gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux/ -c Test.c
gcc -shared -fPIC -o libTest.so Test.o

修改library地址 :

export LD_LIBRARY_PATH=~/jni/

结果如下:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值