当前位置: 代码迷 >> Android >> 本机/ C ++ / Java Android NDK / JNI-在活动之间共享本机代码(MSDN hello-jni示例修改)
  详细解决方案

本机/ C ++ / Java Android NDK / JNI-在活动之间共享本机代码(MSDN hello-jni示例修改)

热度:65   发布时间:2023-08-04 11:11:39.0

我是Android开发的新手,因此决定尝试MSDN的示例解决方案hello-jni,位于此处:

在不进行修改的情况下打开示例并从Visual Studio 2015社区运行可以正常工作。 我正在LG L16C cheapo android手机(Android 4.4.2,针对Android 19进行编译)上运行以进行所有测试。

尽管“ R”标识符未显示在Intellisense中,但我已经能够创建具有其自身布局的其他活动,而不会出现问题。 该示例具有一个从Java调用的本地代码方法,该方法返回一个字符串,并在“主要活动” HelloJNI Java类中使用。 这也都可以正常工作。

但是,当我尝试在另一个活动类中使用相同的代码(本机c ++和java代码调用本机代码)时,它将失败。 我还复制了在Visual Studio中完成的在Android 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); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } public native String stringFromJNI(); 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> 

这是包含本地代码的hello-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

您需要发布本机C代码或错误日志,所以我不能确定-但我敢打赌,您没有将其更改为具有正确的函数名,因此找不到与本机函数匹配的项。 注意函数的名称:Java_com_example_hellojni_HelloJni_stringFromJNI。 为了匹配,名称必须为Java_your_package_name_with_underscore_for_period_classname_functionname。

  相关解决方案