Browse Source
remove android related interface
remove android related interface
Max Lv
10 years ago
3 changed files with 2 additions and 228 deletions
Split View
Diff Options
-
184src/android.cpp
-
17src/android.h
-
29src/local.c
@ -1,184 +0,0 @@ |
|||
#define LOG_TAG "Shadowsocks"
|
|||
|
|||
#include <android/log.h>
|
|||
#include <stdio.h>
|
|||
#include <stdlib.h>
|
|||
#include <unistd.h>
|
|||
|
|||
#include "android.h"
|
|||
|
|||
#define LOGI(...) do { __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__); } while(0)
|
|||
#define LOGW(...) do { __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__); } while(0)
|
|||
#define LOGE(...) do { __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } while(0)
|
|||
|
|||
/*
|
|||
* This is called by the VM when the shared library is first loaded. |
|||
*/ |
|||
|
|||
typedef union { |
|||
JNIEnv* env; |
|||
void* venv; |
|||
} UnionJNIEnvToVoid; |
|||
|
|||
typedef unsigned short char16_t; |
|||
|
|||
class String8 { |
|||
public: |
|||
String8() { |
|||
mString = 0; |
|||
} |
|||
|
|||
~String8() { |
|||
if (mString) { |
|||
free(mString); |
|||
} |
|||
} |
|||
|
|||
void set(const char16_t* o, size_t numChars) { |
|||
if (mString) { |
|||
free(mString); |
|||
} |
|||
mString = (char*) malloc(numChars + 1); |
|||
if (!mString) { |
|||
return; |
|||
} |
|||
for (size_t i = 0; i < numChars; i++) { |
|||
mString[i] = (char) o[i]; |
|||
} |
|||
mString[numChars] = '\0'; |
|||
} |
|||
|
|||
const char* string() { |
|||
return mString; |
|||
} |
|||
private: |
|||
char* mString; |
|||
}; |
|||
|
|||
static UnionJNIEnvToVoid uenv; |
|||
static jmethodID newProtectedSocketMethod = NULL; |
|||
static jmethodID freeProtectedSocketMethod = NULL; |
|||
static jclass vpnClazz = NULL; |
|||
static jclass daemonClazz = NULL; |
|||
|
|||
|
|||
int main (int argc, char **argv); |
|||
|
|||
jint Java_com_github_shadowsocks_daemon_exec(JNIEnv *env, jobject thiz, jobjectArray argv) { |
|||
|
|||
int argc = argv ? env->GetArrayLength(argv) : 0; |
|||
char **daemon_argv = NULL; |
|||
String8 tmp_8; |
|||
|
|||
if (argc > 0) { |
|||
daemon_argv = (char **)malloc((argc+1)*sizeof(char *)); |
|||
for (int i = 0; i < argc; ++i) { |
|||
jstring arg = reinterpret_cast<jstring>(env->GetObjectArrayElement(argv, i)); |
|||
const jchar *str = env->GetStringCritical(arg, 0); |
|||
tmp_8.set(str, env->GetStringLength(arg)); |
|||
env->ReleaseStringCritical(arg, str); |
|||
daemon_argv[i] = strdup(tmp_8.string()); |
|||
} |
|||
daemon_argv[argc] = NULL; |
|||
} |
|||
|
|||
int ret = main(argc, daemon_argv); |
|||
|
|||
for (int i = 0; i < argc; i++) free(daemon_argv[i]); |
|||
free(daemon_argv); |
|||
|
|||
return ret; |
|||
} |
|||
|
|||
/*
|
|||
* Register several native methods for one class. |
|||
*/ |
|||
static int registerNativeMethods(JNIEnv* env) |
|||
{ |
|||
const char *daemonClassPathName = "com/github/shadowsocks/Daemon"; |
|||
const char *vpnClassPathName = "com/github/shadowsocks/ShadowsocksVpnService"; |
|||
|
|||
vpnClazz = env->FindClass(vpnClassPathName); |
|||
|
|||
if (vpnClazz == NULL) |
|||
{ |
|||
LOGE("Native registration unable to find class '%s'", vpnClassPathName); |
|||
return JNI_FALSE; |
|||
} |
|||
newProtectedSocketMethod = env->GetStaticMethodID(vpnClazz, "newProtectedSocket", "()I"); |
|||
if (newProtectedSocketMethod < 0) |
|||
{ |
|||
LOGE("RegisterNatives failed for newProtectedSocketMethod"); |
|||
return JNI_FALSE; |
|||
} |
|||
freeProtectedSocketMethod = env->GetStaticMethodID(vpnClazz, "freeProtectedSocket", "(I)V"); |
|||
if (freeProtectedSocketMethod < 0) |
|||
{ |
|||
LOGE("RegisterNatives failed for freeProtectedSocketMethod"); |
|||
return JNI_FALSE; |
|||
} |
|||
|
|||
daemonClazz = env->FindClass(daemonClassPathName); |
|||
|
|||
if (daemonClazz == NULL) |
|||
{ |
|||
LOGE("Native registration unable to find class '%s'", daemonClassPathName); |
|||
return JNI_FALSE; |
|||
} |
|||
|
|||
JNINativeMethod methods[] = { |
|||
{ "exec", "([Ljava/lang/String;)I", |
|||
(void*) Java_com_github_shadowsocks_daemon_exec } |
|||
}; |
|||
|
|||
if (env->RegisterNatives(daemonClazz, methods, 1) < 0) { |
|||
LOGE("RegisterNatives failed for '%s'", daemonClassPathName); |
|||
return JNI_FALSE; |
|||
} |
|||
|
|||
return JNI_TRUE; |
|||
} |
|||
|
|||
jint new_protected_socket() |
|||
{ |
|||
if (newProtectedSocketMethod != NULL) |
|||
{ |
|||
JNIEnv* env = uenv.env; |
|||
return env->CallStaticIntMethod(vpnClazz, newProtectedSocketMethod); |
|||
} |
|||
return -1; |
|||
} |
|||
|
|||
void free_protected_socket(jint fd) |
|||
{ |
|||
if (newProtectedSocketMethod != NULL) |
|||
{ |
|||
JNIEnv* env = uenv.env; |
|||
env->CallStaticVoidMethod(vpnClazz, freeProtectedSocketMethod, fd); |
|||
} |
|||
} |
|||
|
|||
jint JNI_OnLoad(JavaVM* vm, void* reserved) |
|||
{ |
|||
uenv.venv = NULL; |
|||
jint result = -1; |
|||
JNIEnv* env = NULL; |
|||
|
|||
LOGI("JNI_OnLoad"); |
|||
|
|||
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { |
|||
LOGE("ERROR: GetEnv failed"); |
|||
goto bail; |
|||
} |
|||
env = uenv.env; |
|||
|
|||
if (registerNativeMethods(env) != JNI_TRUE) { |
|||
LOGE("ERROR: registerNatives failed"); |
|||
goto bail; |
|||
} |
|||
|
|||
result = JNI_VERSION_1_4; |
|||
|
|||
bail: |
|||
return result; |
|||
} |
@ -1,17 +0,0 @@ |
|||
#ifndef _JNI_H |
|||
#define _JNI_H |
|||
|
|||
#include <jni.h> |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
jint new_protected_socket(); |
|||
void free_protected_socket(jint fd); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif // _JNI_H |
Write
Preview
Loading…
Cancel
Save