Kam*_*waj 7 android android-ndk
我是android ndk的新手.
我正在开发一个需要java代码以及c/c ++代码的应用程序
所以,为此我需要android ndk.
但我坚持这一点,我不能运行ndk-build,这使得java和c/c ++之间的连接.
所以.请有人帮我解决这个问题.
我试过Windows和Linux但是同样的错误.
当我使用ndk-build时出现此错误.
/home/kamal/android-ndk-r8e/build/core/add-application.mk:128: Android NDK:
Compile thumb : ndk <= native.c
jni/native.c: In function 'Java_com_example_demo_MainActivity_hello':
jni/native.c:4:3: error: parameter name omitted
jni/native.c:4:3: error: parameter name omitted
jni/native.c:5:10: error: 'env' undeclared (first use in this function)
jni/native.c:5:10: note: each undeclared identifier is reported only once for each function it appears in
jni/native.c: In function 'Java_com_example_demo_MainActivity_add':
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:10:9: error: 'value1' undeclared (first use in this function)
jni/native.c:10:18: error: 'value2' undeclared (first use in this function)
make: *** [obj/local/armeabi/objs/myjni/native.o] Error 1
Run Code Online (Sandbox Code Playgroud)
小智 21
首先你得到这个错误,因为你没有声明参数必须在java和c/c ++之间创建连接.
所以,我发给你你的问题代码
1.首先在eclipse中创建android项目.
在项目单击下创建文件夹 - >单击新建 - >然后文件夹并将其命名为jni.
在jni nameing include下再创建一个文件夹.
创建java类.
java类名称的代码 - (MainActivity.java) - >
package com.example.ndk;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
static {
System.loadLibrary("myjni");
}
/**
* Adds two integers, returning their sum
*/
public native int add( int v1, int v2 );
/**
* Returns Hello World string
*/
public native String hello();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)打开命令提示符或按窗口+ R.
移动到目录 - (工作区 - >项目名称 - > jni - >包含).
在此目录下运行命令.
javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity
Run Code Online (Sandbox Code Playgroud)在此之后我们可以在include文件夹下看到"HelloJNI.h"文件.
检查"HelloJNI.h"中有这一行
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add(JNIEnv *, jobject, jint, jint);
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *, jobject);
Run Code Online (Sandbox Code Playgroud)在jni命名test.c下创建新文件(在此文件test.c中使用pont 10中的这2个点)
#include <jni.h>
#include "include/HelloJNI.h"
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello
(JNIEnv *env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello");
}
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add
(JNIEnv *env, jobject javaThis, jint value1, jint value2){
return (value1 + value2);
}
Run Code Online (Sandbox Code Playgroud)在jni命名Android.mk下创建新文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myjni // from point 5
LOCAL_SRC_FILES := test.c //from point 10 that we creare test.c
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)创建新文件NDKActivity.java
package com.example.ndk;
import android.app.Activity;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class NDKActivity extends Activity{
Button buttonCalc;
TextView result;
EditText value1,value2;
/** Called when the activity is first created. */
MainActivity nativeLib;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nativeLib = new MainActivity();
String helloText = nativeLib.hello();
result = (TextView) findViewById(R.id.result);
value1 = (EditText) findViewById(R.id.value1);
value2 = (EditText) findViewById(R.id.value2);
// Update the UI
TextView outText = (TextView) findViewById(R.id.textOut);
outText.setText(helloText);
// Setup the UI
buttonCalc = (Button)this.findViewById(R.id.buttonCalc);
buttonCalc.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int v1, v2, res = -1;
v1 = Integer.parseInt(value1.getText().toString().trim());
v2 = Integer.parseInt(value2.getText().toString().trim());
res = nativeLib.add(v1, v2);
result.setText(new Integer(res).toString());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)在命令promt中运行ndk-build
转到项目目录 - >然后,编写此命令<android-ndk-directory>\ndk-build.cmd并按Enter键
在此之后我们可以检查obj文件夹下的.so文件
NDKActivity的xml文件.
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Vikram"
android:textSize="22sp"/>
<TextView android:id="@+id/textOut"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Output"/>
<EditText
android:id="@+id/value1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Value 1"
android:inputType="numberDecimal" />
<TextView android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="+"
android:textSize="36sp" />
<EditText
android:id="@+id/value2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Value 2"
android:inputType="numberDecimal" />
<Button android:id="@+id/buttonCalc"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="=" />
<TextView android:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="result"
android:textSize="36sp" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
13885 次 |
| 最近记录: |