2017-02-13 10 views
0

Я новичок в разработке Android и решил попробовать образец решения MSDN под названием hello-jni, расположенный здесь:Native/C++/Java Android NDK/JNI - совместное использование родного кода (MSDN hello-jni Sample Modification)

https://code.msdn.microsoft.com/hello-jni-android-790ab73d

Открытие образца без изменений и работы с Visual Studio 2015 Сообщество работает нормально. Я работаю на своем мобильном телефоне LG L16C дешево (Android 4.4.2, компилируюсь против Android 19) для всех моих тестов.

Я смог создать дополнительную деятельность с ее собственной компоновкой без проблем, несмотря на то, что идентификатор «R» не отображается в Intellisense. Образец имеет метод нативного кода, вызывается из Java, который возвращает строку и используется в «основной деятельности», JavaJAJ класса JavaJJI. Это также работает без проблем.

Однако, когда я пытаюсь использовать тот же код (собственный код C++ и java-код для вызова собственного кода) в другом классе активности, он терпит неудачу. Я также продублировал каждый шаг, который я пробовал в Android Studio, который был выполнен в Visual Studio, дублируя образец hello-jni для целей сравнения, и я получаю те же результаты там - всякий раз, когда второе действие пытается использовать какой-либо собственный код, приложение просто падает ,

Любые предложения, что я могу делать неправильно здесь?

Если вы загрузите образец, как есть, а затем добавьте в него следующие изменения, вы можете воспроизвести проблему:

AnotherActivity.java:

package com.miahcode.hellojni; 
 

 
import android.app.Activity; 
 
import android.content.Intent; 
 
import android.os.Bundle; 
 
import android.view.View; 
 
import android.widget.TextView; 
 

 
public class AnotherActivity extends Activity { 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     
 
\t \t TextView tv = new TextView(this); 
 
\t \t tv.setText(stringFromJNI()); 
 
     setContentView(tv); 
 
    } 
 

 
\t public native String stringFromJNI(); 
 

 
\t static { 
 
     System.loadLibrary("hello-jni"); 
 
    } 
 
}

AndriodManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 
     package="com.miahcode.hellojni" 
 
     android:versionCode="1" 
 
     android:versionName="1.0"> 
 
    <uses-sdk android:minSdkVersion="3" /> 
 
    <application android:label="@string/app_name" 
 
       android:debuggable="true"> 
 
    <activity android:name=".HelloJni" 
 
       android:label="@string/app_name"> 
 
     <intent-filter> 
 
     <action android:name="android.intent.action.MAIN" /> 
 
     <category android:name="android.intent.category.LAUNCHER" /> 
 
     </intent-filter> 
 
    </activity> 
 
    <activity android:name=".AnotherActivity"></activity> 
 
    </application> 
 
</manifest>

Вот привет-jni.c, который таит в машинный код:

/* 
 
* 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. 
 
* 
 
*/ 
 
#include <string.h> 
 
#include <jni.h> 
 

 
/* This is a trivial JNI miahcode where we use a native method 
 
* to return a new VM String. See the corresponding Java source 
 
* file located at: 
 
* 
 
* apps/samples/hello-jni/project/src/com/miahcode/hellojni/HelloJni.java 
 
*/ 
 
jstring Java_com_miahcode_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) 
 
{ 
 
#if defined(__arm__) 
 
    #if defined(__ARM_ARCH_7A__) 
 
    #if defined(__ARM_NEON__) 
 
     #if defined(__ARM_PCS_VFP) 
 
     #define ABI "armeabi-v7a/NEON (hard-float)" 
 
     #else 
 
     #define ABI "armeabi-v7a/NEON" 
 
     #endif 
 
    #else 
 
     #if defined(__ARM_PCS_VFP) 
 
     #define ABI "armeabi-v7a (hard-float)" 
 
     #else 
 
     #define ABI "armeabi-v7a" 
 
     #endif 
 
    #endif 
 
    #else 
 
    #define ABI "armeabi" 
 
    #endif 
 
#elif defined(__i386__) 
 
    #define ABI "x86" 
 
#elif defined(__x86_64__) 
 
    #define ABI "x86_64" 
 
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ 
 
    #define ABI "mips64" 
 
#elif defined(__mips__) 
 
    #define ABI "mips" 
 
#elif defined(__aarch64__) 
 
    #define ABI "arm64-v8a" 
 
#else 
 
    #define ABI "unknown" 
 
#endif 
 

 
    return (*env)->NewStringUTF(env, "Compiled with ABI " ABI "."); 
 
}

Спасибо, J

ответ

0

Вы должны опубликовать свой собственный код C или журнал ошибок, поэтому я не могу быть уверен, но моя ставка заключается в том, что вы не изменили его, чтобы иметь правильное имя функции, поэтому он не может найти соответствие для родной функции на. Обратите внимание на имя функции: Java_com_example_hellojni_HelloJni_stringFromJNI. Чтобы соответствовать, имя должно быть Java_your_package_name_with_underscore_for_period_classname_functionname.

+0

ОК, я добавил собственный код. Я думаю, ты, возможно, прав. Я изменил часть примера на «miahcode», пока я играл с тем, что работает, а что нет. Я попытаюсь создать новую функцию, которая делает то же самое в собственном коде, но использует соглашение об именах для другого действия и, если это работает. Спасибо за вашу помощь. – Miah

+0

Просто попробовал, и он работает! – Miah

 Смежные вопросы

  • Нет связанных вопросов^_^