jni——C语言小示例

xiaoxiao2021-02-28  91

之前做一些东西,做完之后发现发现还要做一个接口给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/

结果如下:

 

转载请注明原文地址: https://www.6miu.com/read-21981.html

最新回复(0)