jstring和char*互转
#include <jni.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <android/log.h>
/**
* jstring转到char*
*/
char* jstringToChar(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
/**
* char * 转到jstring
*/
jstring charToJstring(JNIEnv* env, const char* pat) {
jclass strClass = env->FindClass("java/lang/String");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
socket通信以及读写文件
#include "com_test_testSocket_MainActivity.h"
#include "jni_util.h"
#include <arpa/inet.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <android/log.h>
#include <stdio.h>
#include <fcntl.h>
JNIEXPORT void JNICALL Java_com_test_testSocket_MainActivity_beginSocket
(JNIEnv *env, jobject jobj, jstring jstr) {
char *str = jstringToChar(env, jstr);
__android_log_print(ANDROID_LOG_DEBUG, "debug", "str:%s", str);
const char *SERVER = "10.0.2.2";
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in peerAddr;
char buffer[100] = "t";
int ret;
peerAddr.sin_family = AF_INET;
peerAddr.sin_port = htons(8000);
peerAddr.sin_addr.s_addr = inet_addr(SERVER);
ret = connect(sock, (struct sockaddr*)&peerAddr, sizeof(peerAddr));
if(ret != 0) {
__android_log_print(ANDROID_LOG_DEBUG, "debug", "%s", "connect failed");
}
send(sock, buffer, strlen(buffer), 0);
FILE *fp;
//以追加的方式打开文件
if((fp = fopen(str, "w+"))) {
fseek(fp, 0, SEEK_END);
} else {
__android_log_print(ANDROID_LOG_DEBUG, "debug", "error:%s", "打开文件失败");
}
while((ret = recv(sock, buffer, sizeof(buffer), 0)) > 0) {
//java传过来来的参数末尾没有\0
buffer[ret] = '\0';
__android_log_print(ANDROID_LOG_DEBUG, "debug", "time: %s", buffer);
fputs(buffer, fp);
fputs("\r\n", fp); //换行
//强制立即写到磁盘
fflush(fp);
fsync(fileno(fp));
}
fclose(fp);
shutdown(sock, SHUT_RDWR);
}