之前做一些东西,做完之后发现发现还要做一个接口给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);//传入数组,返回int
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);//传入数组,返回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/
结果如下: