Системная среда: Android Studio 3.4 с плагином Gradle до версии 3.4.0 и Gradle до версии 5.1.1.Я создал новый проект -> Файл -> Новый -> Пример импорта -> Ndk -> Привет JNI.Я изменил в файле build.gradle minSdkVersion до 22, потому что мой Nexus 7 не может сделать больше.Затем я скачал jexcel_android.jar из https://sourceforge.net/projects/jexcelandroid/ и скопировал jexcel_android.jar в ... app / libs /. В HelloJni.java я добавил немного кода, см. Подробности.В AndroidManifest я просто добавил разрешение на запись в SDCard.
- я ничего не изменил и не добавил.Я смог установить и запустить приложение на Nexus 7 и Nexus 5x.Созданный файл на Nexus 7 показывает ожидаемые английские буквы.Созданный файл Nexus 5x показывает неожиданные китайские буквы.Зачем?Обычно оба устройства показывают английские буквы во всех других приложениях.
Вот код, который я добавил в HelloJni.java: String str = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Retrieve our TextView and set its content.
* the text is retrieved by calling a native
* function.
*/
setContentView(R.layout.activity_hello_jni);
TextView tv = (TextView)findViewById(R.id.hello_textview);
WritableWorkbook wb = createWorkbook("my.xls");
WritableSheet sh = createSheet(wb,"mysheet", 0);
try {
//writeCell(0, 0, "hi", true, sh);
wb.write();
wb.close();
}
catch (
IOException ex) {
ex.printStackTrace();
}
catch (
WriteException ex) {
ex.printStackTrace();
}
str += "\n" +stringFromJNI();
tv.setText( str );
}
/**
*
* @param wb - WritableWorkbook to create new sheet in
* @param sheetName - name to be given to new sheet
* @param sheetIndex - position in sheet tabs at bottom of workbook
* @return - a new WritableSheet in given WritableWorkbook
*/
public WritableSheet createSheet(WritableWorkbook wb,
String sheetName, int sheetIndex){
//create a new WritableSheet and return it
return wb.createSheet(sheetName, sheetIndex);
}
/**
*
* @param fileName - the name to give the new workbook file
* @return - a new WritableWorkbook with the given fileName
*/
public WritableWorkbook createWorkbook(String fileName){
//exports must use a temp file while writing to avoid memory hogging
WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setUseTemporaryFileDuringWrite(true);
str += wbSettings.getLocale().getLanguage();
//Log.i("HelloJni", " wbSettings.getLocale().getLanguage()=" +wbSettings.getLocale().getLanguage());
//get the sdcard's directory
File sdCard = Environment.getExternalStorageDirectory();
//add on the your app's path
File dir = new File(sdCard.getAbsolutePath() + "/");
//make them in case they're not there
dir.mkdirs();
//create a standard java.io.File object for the Workbook to use
File wbfile = new File(dir,fileName);
WritableWorkbook wb = null;
try{
//create a new WritableWorkbook using the java.io.File and
//WorkbookSettings from above
wb = Workbook.createWorkbook(wbfile,wbSettings);
}catch(IOException ex){
Log.e(className,ex.getStackTrace().toString());
Log.e(className, ex.getMessage());
}
return wb;
}
Logcat Android Studio для Nexus 7выглядит как ожидалось.Но в Nexus 5x я получил много информации / сообщений об ошибках.Прибл.Это 5 раз, каждый раз одно и то же, так что вы видите только неповторяющиеся вещи:
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:515)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:423)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:374)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at android.view.ViewGroup android.support.v7.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:607)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.support.v7.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:518)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.support.v7.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:466)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.support.v7.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:140)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void com.example.hellojni.HelloJni.onCreate(android.os.Bundle) (HelloJni.java:75)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.Activity.performCreate(android.os.Bundle, android.os.PersistableBundle) (Activity.java:7009)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:7000)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1214)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2731)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.os.Looper.loop() (Looper.java:164)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
2019-04-27 21:04:25.650 21326-21326/com.example.hellojni I/zygote: at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at void android.support.v4.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2341)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at void android.support.v7.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:62)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:334)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:647)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:790)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:730)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:863)
2019-04-27 21:04:25.651 21326-21326/com.example.hellojni I/zygote: at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:824)