clone https://gitea.winboll.cc/Studio/WinBoLL_Bck20251205_175044_440.git and fix build.gradle file maven key settings.
This commit is contained in:
56
jcndk/src/cc/winboll/studio/jcndk/FileUtils.java
Normal file
56
jcndk/src/cc/winboll/studio/jcndk/FileUtils.java
Normal file
@@ -0,0 +1,56 @@
|
||||
package cc.winboll.studio.jcndk;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@qq.com>
|
||||
* @Date 2025/01/08 16:31:28
|
||||
* @Describe 文件工具类
|
||||
*/
|
||||
import android.content.Context;
|
||||
import android.content.res.AssetManager;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import cc.winboll.studio.libjc.Log;
|
||||
|
||||
public class FileUtils {
|
||||
|
||||
public static final String TAG = "FileUtils";
|
||||
|
||||
public static void copyAssetsToSD(Context context, String szSrcAssets, String szDstSD) {
|
||||
Log.d(TAG, "copyAssetsToSD [" + szSrcAssets + "] to [" + szDstSD + "]");
|
||||
AssetManager assetManager = context.getAssets();
|
||||
InputStream inputStream = null;
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
inputStream = assetManager.open(szSrcAssets);
|
||||
File outputFile = new File(szDstSD);
|
||||
outputStream = new FileOutputStream(outputFile);
|
||||
byte[] buffer = new byte[1024];
|
||||
int length = 0;
|
||||
while ((length = inputStream.read(buffer)) > 0) {
|
||||
outputStream.write(buffer, 0, length);
|
||||
}
|
||||
outputStream.flush();
|
||||
Log.d(TAG, "copyAssetsToSD done.");
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e, Thread.currentThread().getStackTrace());
|
||||
} finally {
|
||||
if (inputStream != null) {
|
||||
try {
|
||||
inputStream.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e, Thread.currentThread().getStackTrace());
|
||||
}
|
||||
}
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e, Thread.currentThread().getStackTrace());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
265
jcndk/src/cc/winboll/studio/jcndk/HelloJni.java
Normal file
265
jcndk/src/cc/winboll/studio/jcndk/HelloJni.java
Normal file
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (C) 2009 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cc.winboll.studio.jcndk;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
import cc.winboll.studio.jcndk.R;
|
||||
import cc.winboll.studio.libjc.JAR_RUNNING_MODE;
|
||||
import cc.winboll.studio.libjc.JCMainThread;
|
||||
import cc.winboll.studio.libjc.Log;
|
||||
import cc.winboll.studio.libjc.net.JCSocketServer;
|
||||
import java.io.File;
|
||||
|
||||
|
||||
public class HelloJni extends Activity implements JCMainThread.OnMessageListener {
|
||||
|
||||
public static String TAG = "HelloJni";
|
||||
final public static int MSG_APPEN = 0;
|
||||
|
||||
MessageHandler mMessageHandler;
|
||||
static JCMainThread _JCMainThread;
|
||||
StringBuilder mStringBuilder;
|
||||
Context mContext;
|
||||
ScrollView mScrollView;
|
||||
LinearLayout mRootLayout;
|
||||
TextView mTextView;
|
||||
EditText mEditText;
|
||||
Button mButton;
|
||||
JCSocketServer mJCSocketServer;
|
||||
JCMainServerThread mJCMainServerThread;
|
||||
|
||||
// @Override
|
||||
// public void log(String message) {
|
||||
// Message msg = mMessageHandler.obtainMessage(MSG_APPEN, message);
|
||||
// mMessageHandler.sendMessage(msg);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void outPrint(String message) {
|
||||
Message msg = mMessageHandler.obtainMessage(MSG_APPEN, message);
|
||||
mMessageHandler.sendMessage(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void errPrint(String message) {
|
||||
Message msg = mMessageHandler.obtainMessage(MSG_APPEN, message);
|
||||
mMessageHandler.sendMessage(msg);
|
||||
}
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
// 初始化日志类
|
||||
Log.init(getPackageName());
|
||||
Log.d(TAG, "onCreate");
|
||||
// 初始化视图元素
|
||||
mContext = this;
|
||||
mMessageHandler = new MessageHandler();
|
||||
//initView();
|
||||
initView2();
|
||||
// 测试添加消息 方式 1
|
||||
appendMessage("appendMessage(...) test.\n");
|
||||
// 测试添加消息 方式 2
|
||||
int szwhat = MSG_APPEN;
|
||||
String szobj = "mMessageHandler.sendMessage(...) test.\n";
|
||||
Message msg = mMessageHandler.obtainMessage(szwhat, szobj);
|
||||
mMessageHandler.sendMessage(msg);
|
||||
|
||||
// 启动主线程
|
||||
_JCMainThread = JCMainThread.getInstance(getPackageName());
|
||||
_JCMainThread.setOnLogListener(this);
|
||||
_JCMainThread.setRunningMode(JAR_RUNNING_MODE.JCNDK);
|
||||
_JCMainThread.start();
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException e) {
|
||||
Log.e(TAG, e, Thread.currentThread().getStackTrace());
|
||||
}
|
||||
appendMessage("Switch To Termux Bash Shell ...");
|
||||
File dirHome = new File(getFilesDir(), "home");
|
||||
if (!dirHome.exists()) {
|
||||
dirHome.mkdirs();
|
||||
}
|
||||
String szBashSwitchFileName = "switch2bash.sh";
|
||||
File fDstBashSwitch = new File(dirHome, szBashSwitchFileName);
|
||||
FileUtils.copyAssetsToSD(this, szBashSwitchFileName, fDstBashSwitch.toPath().toString());
|
||||
_JCMainThread.exeInit("cd " + dirHome.toPath().toString());
|
||||
_JCMainThread.exeInit("ash " + szBashSwitchFileName);
|
||||
|
||||
//Intent intent = new Intent(this, JCMainService.class);
|
||||
//startService(intent);
|
||||
mJCMainServerThread = new JCMainServerThread();
|
||||
mJCMainServerThread.start();
|
||||
}
|
||||
|
||||
void initView2() {
|
||||
View mainView = getLayoutInflater().inflate(R.layout.view_main, null);
|
||||
mRootLayout = mainView.findViewById(R.id.viewmainLinearLayout1);
|
||||
mScrollView = mainView.findViewById(R.id.viewmainScrollView1);
|
||||
mTextView = mainView.findViewById(R.id.viewmainTextView1);
|
||||
mButton = mainView.findViewById(R.id.viewmainButton1);
|
||||
mEditText = mainView.findViewById(R.id.viewmainEditText1);
|
||||
setContentView(mRootLayout);
|
||||
|
||||
mButton.setOnClickListener(new View.OnClickListener(){
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mJCSocketServer.sendMessage(mEditText.getText().toString());
|
||||
|
||||
//System.out.println("onClick");
|
||||
//_JCMainThread.exeBashCommand(mEditText.getText().toString());
|
||||
mEditText.setText("");
|
||||
}
|
||||
});
|
||||
}
|
||||
//
|
||||
// //
|
||||
// // 函数式初始化视图元素
|
||||
// //
|
||||
// void initView() {
|
||||
// // 创建一个线性布局作为根布局
|
||||
// mRootLayout = new LinearLayout(mContext);
|
||||
// mRootLayout.setOrientation(LinearLayout.VERTICAL);
|
||||
// mRootLayout.setLayoutParams(new LinearLayout.LayoutParams(
|
||||
// ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
// ViewGroup.LayoutParams.MATCH_PARENT
|
||||
// ));
|
||||
//
|
||||
// // 创建ScrollView
|
||||
// mScrollView = new ScrollView(mContext);
|
||||
// mScrollView.setLayoutParams(new LinearLayout.LayoutParams(
|
||||
// ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
// ViewGroup.LayoutParams.MATCH_PARENT
|
||||
// ));
|
||||
//
|
||||
// // 创建TextView
|
||||
// mTextView = new TextView(mContext);
|
||||
// mTextView.setTextColor(Color.BLACK);
|
||||
// mTextView.setTextSize(16);
|
||||
// mTextView.setGravity(Gravity.LEFT);
|
||||
// mTextView.setLayoutParams(new LinearLayout.LayoutParams(
|
||||
// ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
// ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
// ));
|
||||
//
|
||||
// // 模拟添加文本内容
|
||||
// /*String longText = "";
|
||||
// for (int i = 0; i < 100; i++) {
|
||||
// longText += "这是一些示例文本内容,用于测试滚动效果。\n";
|
||||
// }
|
||||
// textView.setText(longText);*/
|
||||
//
|
||||
// // 将TextView添加到ScrollView中
|
||||
// mScrollView.addView(mTextView);
|
||||
//
|
||||
// // 将ScrollView添加到根布局中
|
||||
// mRootLayout.addView(mScrollView);
|
||||
//
|
||||
// // 设置Activity的内容视图为根布局
|
||||
// setContentView(mRootLayout);
|
||||
//
|
||||
// }
|
||||
|
||||
//
|
||||
// 添加输出消息
|
||||
//
|
||||
void appendMessage(String szMessage) {
|
||||
mTextView.append(szMessage);
|
||||
|
||||
// 让ScrollView滚动到底部
|
||||
mScrollView.post(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/* A native method that is implemented by the
|
||||
* 'hello-jni' native library, which is packaged
|
||||
* with this application.
|
||||
*/
|
||||
public native String stringFromJNI();
|
||||
|
||||
/* This is another native method declaration that is *not*
|
||||
* implemented by 'hello-jni'. This is simply to show that
|
||||
* you can declare as many native methods in your Java code
|
||||
* as you want, their implementation is searched in the
|
||||
* currently loaded native libraries only the first time
|
||||
* you call them.
|
||||
*
|
||||
* Trying to call this function will result in a
|
||||
* java.lang.UnsatisfiedLinkError exception !
|
||||
*/
|
||||
public native String unimplementedStringFromJNI();
|
||||
|
||||
/* this is used to load the 'hello-jni' library on application
|
||||
* startup. The library has already been unpacked into
|
||||
* /data/data/com.example.hellojni/lib/libhello-jni.so at
|
||||
* installation time by the package manager.
|
||||
*/
|
||||
static {
|
||||
System.loadLibrary("hello-jni");
|
||||
}
|
||||
|
||||
class MessageHandler extends Handler {
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_APPEN : {
|
||||
appendMessage(String.format("%s", msg.obj));
|
||||
}
|
||||
}
|
||||
super.handleMessage(msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class JCMainServerThread extends Thread {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
super.run();
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
System.err.println(String.format("%s Exception : %s", TAG, e.getMessage()));
|
||||
Log.e(TAG, e, Thread.currentThread().getStackTrace());
|
||||
}
|
||||
System.out.println("JCMainServerThread run()");
|
||||
mJCSocketServer = JCSocketServer.getInstance();
|
||||
mJCSocketServer.main(null);
|
||||
System.out.println("JCMainServerThread exit.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package cc.winboll.studio.jcndk.services;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen<zhangsken@qq.com>
|
||||
* @Date 2025/01/09 11:19:28
|
||||
* @Describe JC 主服务类
|
||||
*/
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import cc.winboll.studio.libjc.Main;
|
||||
import cc.winboll.studio.libjc.net.JCSocketServer;
|
||||
|
||||
public class JCMainService extends Service {
|
||||
|
||||
public static final String TAG = "JCService";
|
||||
|
||||
JCMainServiceThread mJCMainServiceThread;
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
System.out.println("onStartCommand");
|
||||
mJCMainServiceThread = new JCMainServiceThread();
|
||||
mJCMainServiceThread.start();
|
||||
return super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
|
||||
class JCMainServiceThread extends Thread {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
super.run();
|
||||
System.out.println("JCMainServiceThread run()");
|
||||
JCSocketServer.main(null);
|
||||
System.out.println("JCMainServiceThread exit.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user